코딩테스트/백준

백준 > 단계별로 풀어보기 > 일반 수학 1 > 1193번: 분수찾기

나는야석사 2024. 7. 22. 11:41

문제

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

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)가 주어진다.

출력

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

예제 입력 1 복사

1

예제 출력 1 복사

1/1

예제 입력 2 복사

2

예제 출력 2 복사

1/2

예제 입력 3 복사

3

예제 출력 3 복사

2/1

예제 입력 4 복사

4

예제 출력 4 복사

3/1

예제 입력 5 복사

5

예제 출력 5 복사

2/2

예제 입력 6 복사

6

예제 출력 6 복사

1/3

예제 입력 7 복사

7

예제 출력 7 복사

1/4

예제 입력 8 복사

8

예제 출력 8 복사

2/3

예제 입력 9 복사

9

예제 출력 9 복사

3/2

예제 입력 10 복사

14

예제 출력 10 복사

2/4

 

X = int(input())

line = 0
end_of_line = 0

while X > end_of_line:
    line += 1
    end_of_line += line

gap = end_of_line - X

if line % 2 == 0:
    boonja = line - gap
    boonmo = gap + 1

if line % 2 == 1:
    boonja = gap + 1
    boonmo = line - gap

print(f"{boonja}/{boonmo}")

 

분수 순서

1/1 -> 1/2, 2/1 -> 3/1, 2/2, 1/3 -> 1/4, 2/3, 3/2, 4/1 순

첫 번째 대각선 1/1

두 번째 대각선 1/2, 2/1

세 번째 대각선 3/1, 2/2, 1/3

네 번째 대각선 1/4, 2/3, 3/2, 4/1

 

주어진 수가 7일 때 답은 1/4임. 1/4는 7번째 분수이며 네 번째 대각선에 존재함.

또한 첫 번째 대각선은 하나의 분수

두 번째 대각선은 두 개의 분수

세 번째 대각선은 세 개의 분수

네 번째 대각선은 네 개의 분수를 가짐

end_of_line을 구하는 이유는 몇 번째 대각선에 위치하는지를 알기 위해서임

즉 네 번째 대각선의 경우 end_of_line은 10이 됨

실제로 네 번째 대각선까지 분수들의 개수의 합은 10임

 

end_of_line은 각 대각선의 끝 번호를 나타냄

예를 들어, 1번째 대각선의 끝 번호는 1, 2번째 대각선의 끝 번호는 3(1+2), 3번째 대각선의 끝 번호는 6(1+2+3), 4번째 대각선의 끝 번호는 10(1+2+3+4)임

 

X가 end_of_line보다 작거나 같아지는 시점에서, 해당 X는 그 대각선에 속하게 됨 

 

gap은 해당 대각선의 끝 번호에서 X를 뺀 값으로, 대각선의 끝에서 X가 몇 번째 위치에 있는지를 보여줌

 

X=7일 경우 end_of_line은 10이며 gap은 3으로 X 번째 수는 end_of_line(대각선의 끝 번호)로부터 3번째 위치에 있음

 

짝수번째 대각선의 경우

분자는 1부터 1씩 커지고

분모는 대각선의 번호부터 1씩 감소함

 

홀수번째 대각선의 경우

분자는 대각선의 번호부터 1씩 감소하고

분모는 1부터 1씩 커짐 

 

아직도 잘 모르겠다..