Algorithm/백준

[알고리즘]백준 1193번: 분수찾기

Im_light.J 2023. 2. 6. 01:25
728x90

알고리즘: 수학

 

문제

무한히 큰 배열에 다음과 같이 분수들이 적혀있다.

1/1 1/2 1/3 1/4 1/5
2/1 2/2 2/3 2/4
3/1 3/2 3/3
4/1 4/2
5/1

이와 같이 나열된 분수들을 1/1 → 1/2 → 2/1 → 3/1 → 2/2 → … 과 같은 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자.

X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 분수를 출력한다.

 

풀이


2차원 배열의 대각선 성분의 길이는 1씩 늘어납니다. 

처음에는 1/1 1개 두번째에는 2/1 1/2 2개 세번째에는 3/1 2/2 1/3의 3개의 순입니다.

 

처음에는 구하고자 하는 분수가 몇번째 대각선에 위치하는지 구해주겠습니다 

각 대각선의 분수의 분모와 분자는 왼쪽을 기준으로 각각 1씩 차이나는

내림차순과 오름차순입니다(오른쪽을 기준으로 하면 반대) 

 

이 성질을 이용해 쉽게 계산할 수 있습니다

 

한가지 고려해야할 점은 대각선마다 기준점이 바뀐다는 것입니다. 

짝수 대각선에서는 왼쪽에서 오른쪽으로 홀수 대각선에서는 오른쪽을 기준으로 합니다

 

 

import sys

N = int(sys.stdin.readline().strip())
idx= 0
#배열이 몇번째(idx) 대각선에 위치하는지 구해보겠습니다
while N>0:
    idx+=1
    N=N-idx 
#반복문을 통해 1부터 값을 점차 증가시켜가며 빼주겠습니다.
N=N+idx
#반복문을 탈출하면 분수가 위치한 대각선의 배열의 길이만큼 빼줬기 때문에 음수가 나오게됩니다 
#이를 다시 더해주겟습니다. 이때 N은 대각선 배열에서 분수의 순번과 동일합니다 
if idx%2==0:
    nums = list(range(1,idx+1))
    print(f"{nums[N-1]}/{idx-N+1}") 
else:
    nums = list(range(idx,0,-1))
    print(f"{nums[N-1]}/{N}")
#홀수일때와 짝수일때 배열의 방향이 바뀌므로 이를 고려해줍니다

 

 

 

 

728x90