Algorithm/Baekjoon

[BOJ/백준] 1139번 파이썬 해결

개발자 까마귀 2024. 11. 18. 12:51
728x90

그림으로 이해하는게 훨씬 빠른 문제이다.

(1) 1/1 (2) 1/2 (6) 1/3 (7) 1/4 1/5 1/6
(3) 2/1 (5) 2/2 (8) 2/3 2/4 2/5 ...
(4) 3/1 (9) 3/2 3/3 3/4 ... ...
(10) 4/1 4/2 4/3 ... ... ...
5/1 5/2 ... ... ... ...
6/1 ... ... ... ... ...

1이 입력으로 주어지면 1/1, 2가 주어지면 1/2, 3이 주어지면 2/1, 4는 3/1, 5는 2/2 ...


나는 수학에 매우 약해서 문제를 거의 혼자 해결하지 못했다.

 

문제를 해결하기 위해선 '입력으로 주어진 수(이하 x)가 몇 번 대각선(이하 line)인가?'를 생각해야한다.

1 = 1

2, 3 = 2

4, 5, 6 = 3

7, 8, 9, 10 = 4

...

이 후에는 1부터 line까지를 더한다.

1 = 1

2 = 3

3 = 6

4 = 10

여기서 알 수 있는 사실은 x는 절대 line까지의 합을 절대 넘지 않는다.

나아가서는 전 line까지의 합을 x에 빼면 분자 또는 분모를 구할 수 있다.

x = int(input())

line = 1

while x < sum_line :
    x -= line
    line += 1

그럼 이제 홀수 line인지, 짝수 line인지에 따라 분자, 분모의 값을 바꿔주면 된다.

왜 line의 홀짝에 따라서 값을 바꾸냐면, 홀수 라인에서는 위로 올라가면서 분자는 1씩 빼주고 분모는 1씩 더하며, 반대로 짝수라인은 아래로 내려가면서 분자는 빼주고 분모는 더하기 때문이다.

x = int(input())

line = 1

while x < sum_line :
    x -= line
    line += 1

numerator = x # 분자 +1
denominator = line - x + 1 # 분모 -1

if line & 1 :
    denominator, numerator = numerator, denominator

print(f"{numerator}/{denominator}")

 

728x90