본문 바로가기

코딩테스트

백준 1193 : 분수찾기

728x90

1193번 분수찾기

  • 문제에서 나열된 분수들이 지그재그 순서로 차례대로 1번, 2번, 3번,4번,... 분수라고 하였고, 첫 줄에 x(1<=x<=10,000,000)이 주어진다 라고 한다.
아이디어
  • 문제에서 나온 순서를 토대로 배열을 만들면

1/1
1/2, 2/1
3/1, 2/2, 1/3
1/4, 2/3, 3/2, 4/1
5/1, 4/2, 3/3, 2/4, 1/5
...
위와 같이 계속 반복되어 질 것이다.

여기서 각 줄마다 특징을 알아보아야 한다!
- 짝수 라인 : 분모가 1씩 늘어나고 분자가 1씩 줄어든다.
- 홀수 라인 : 분자가 1씩 늘어나고 분모가 1씩 줄어든다.

  • 이제 규칙(특징)을 찾았으니까 몇번째 줄에 몇번째 위치의 분수가 무엇인지를 알아내야 한다. while num > line: num -= line line += 1 while문의 loop를 사용해 몇번째 줄이고 몇번째 위치인지를 알아 낼 수 있다..

이제는 짝수일 경우와 홀수일 경우에 나눠서 코드를 구성해야한다.

 

# 짝수일경우
if line % 2 == 0:
    a = num
    b = line - num + 1
# 홀수일경우
elif line % 2 == 1:
    a = line - num + 1
    b = num

print(f'{a}/{b}')
  • 짝수 라인은 1씩 분모가 늘고 분자가 줄고
  • 홀수 라인은 1씩 분모가 줄고 분자가 늘고
  • 이를 활용해서 코드를 구성했다.

line - num + 1 이 코드는 대각선에서 분수의 위치에 따라서 분자 또는 분모를 계산하기 위해 사용된 식으로, 이 값이 a, b냐에 따라서 분자와 분모를 결정하게 되는 것이다.

# 전체코드
num = int(input())
line = 1

while num > line:
    num -= line
    line += 1
    
# 짝수일경우
if line % 2 == 0:
    a = num
    b = line - num + 1
# 홀수일경우
elif line % 2 == 1:
    a = line - num + 1
    b = num

print(f'{a}/{b}')
728x90