1193번: 분수찾기

첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.

www.acmicpc.net

아래 표 처럼 번호 순서대로 규칙성을 가지고 있다. 1은 (1,1)로 시작하고, 2는 (1,2), 3은 (2,1), 4는 (3,1), 5는 (2,2)... 라고 필자는 좌표로 설정하고 코딩을 했다. 

 

만약 사용자가 5라고 입력했을때, 출력되어야 하는 좌표는 (2,2) 이고 답은 2/2 이다.

 

1 > 5

1 + 2 > 5

1 + 2 + 3 > 5 

 

1 + 2 + 3 일때 사용자가 입력한 값보다 처음으로 크므로, 이때 i=3이라고 하자.

i가 홀수 일때는 (1,i)에서, 즉 6에서 x축으로 -1, y축으로 +1해서 5의 위치는 (1, i) + (1,-1) = (2,2) 라는 결과를 얻을 수 있다.

  1 2 3 4 5 6 7 8
1 1 2 6 7 15 16 28 29
2 3 5 8 14 17 27 30 ...
3 4 9 13 18 26 31 ... ...
4 10 12 19 25 32 ... ... ...
5 11 20 24 33 ... ... ... ...
6 21 23 34 ... ... ... ... ...
7 22 35 ... ... ... ... ... ...
8 36 ... ... ... ... ... ... ...

 

만약 사용자가 9 라는 값을 입력했을때, 

 

1 > 9

1 + 2 > 9

1 + 2 + 3 + 4 > 9

 

i=4일때 처음으로 사용자가 입력한 값보다 크다.

i가 짝수 일때, (i,1)에서, 즉 10에서 x축으로 +1, y축으로 -1해서 9의 위치는 (i,1) + (1,-1) = (2,3) 이라는 결과를 얻을 수 있다.

 

아래는 python3으로 코딩한 것이다.

#!/bin/python3

count = int(input(""))
tmp = 0
for i in range(1, 10000000):
    tmp += i
    if tmp > count:
        if i%2 == 0:
            point = [i, 1]
            
            while tmp != count:
                point[0] -= 1
                point[1] += 1
                tmp -= 1
            break
        elif i%2 == 1:
            point = [1, i]
            
            while tmp != count:
                point[0] += 1
                point[1] -= 1
                tmp -= 1
            break
        
    elif tmp == count:
        if i%2 == 0:
            point = [i,1]
            break
        else:
            point = [1, i]
            break
print(str(point[0])+"/"+str(point[1]))

'BaekJoon' 카테고리의 다른 글

1475번 - 방 번호 python  (0) 2019.10.22
[BaekJoon] - 1193 분수찾기  (0) 2019.10.14
[BaekJoon] - 10773 제로  (0) 2019.10.13
[BaekJoon] - 10871 x보다 작은 수  (0) 2019.10.13
[BaekJoon] - 10936 base64 디코딩  (0) 2019.10.12
[BaekJoon] - 10935 base64 인코딩  (0) 2019.10.12