무한히 큰 배열에 다음과 같이 분수들이 적혀있다.
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)가 주어진다.
n
보다 큰 삼각형 수를 찾은 다음에, 빼가면서 값을 찾으면 된다고 생각이 들었다.n = int(input())
def triangle(n):
if n == 1:
return 1
return n + triangle(n-1)
level = 1
while triangle(level) < n:
level += 1
pile = triangle(level)
x = 0
y = 0
if level % 2 == 0:
x = level
y = 1
while pile > n:
x -= 1
y += 1
pile -= 1
else:
x = 1
y = level
while pile > n:
x += 1
y -= 1
pile -= 1
print("%d/%d" % (x, y))
triangle
함수를 재정의 해줬다. 재귀 안하도록^^n = int(input())
def triangle(n):
pile = 0
for i in range(1, n+1):
pile += i
return pile
level = 1
while triangle(level) < n:
level += 1
pile = triangle(level)
x = 0
y = 0
if level % 2 == 0:
x = level
y = 1
while pile > n:
x -= 1
y += 1
pile -= 1
else:
x = 1
y = level
while pile > n:
x += 1
y -= 1
pile -= 1
print("%d/%d" % (x, y))
pile
에서 매번 빼지 않기 위해 diff
변수를 새로 정해 사용해 코드를 수정했다. 시간 초과.x
와 y
값을 하나씩 계산해주는 것을 피하고자, diff
를 깡으로 사용해서 계산했다. 시간 초과.triangle
함수밖에 남지 않았다. 바로 꺼내 쓸 수 있게 바꿔줬다.n = int(input())
triangle = [0]
level = 1
while triangle[-1] < n:
triangle.append(triangle[-1] + level)
level += 1
diff = triangle[-1] - n
if level % 2 == 0:
x = 1 + diff
y = (level - 1) - diff
print("%d/%d" % (x, y))
else:
x = (level - 1) - diff
y = 1 + diff
print("%d/%d" % (x, y))
x
와 y
값도 손질해 줬다. 전자가 분자, 후자가 분모니까.