const fs = require('fs')
const input = fs.readFileSync('/dev/stdin').toString().trim()
const solution = input => {
const sum = n => n*(n+1)/2
let i = 1;
while(sum(i) < input){
i++
}
let a = input - sum(i-1)
return (i+1) % 2 === 1 ? [a, i+1-a].join("/") : [i+1-a, a].join("/")
}
input | 분자 | 분모 | 분자+분모 |
---|---|---|---|
1 | 1 | 1 | 2 |
2 | 1 | 2 | 3 |
3 | 2 | 1 | 3 |
4 | 3 | 1 | 4 |
5 | 2 | 2 | 4 |
6 | 1 | 3 | 4 |
7 | 1 | 4 | 5 |
8 | 2 | 3 | 5 |
9 | 3 | 2 | 5 |
10 | 4 | 1 | 5 |
while문으로 구한 i
는
등차수열의 합sum(i)
가 input값보다 작은, 최대값을 만족하는 분수의 분자+분모
다
예를 들어, input값이 8일 때
조건을 만족하는 등차수열의 합은 sum(3) = sum(i-1)
= 6 이다
👉 6번째 분수의 분자+분모
= i
= 4 라는 의미!
input값이 8이므로 input - sum(i-1)
= a = 8 - 6 = 2 만큼 다음번 분수를 구해줘야 한다
다음번 분수의 분자+분모
는; i+1
= 5 다
분자+분모
가 홀수이면 0 / i+1
에 대해 +a / -a
를
분자+분모
가 짝수이면 i+1 / 0
에 대해 -a / +a
를 하는 규칙이 있다.
i+1
= 5는 홀수 이므로 0+2 / 5-2 = 2/3 을 반환한다
공차가 1인 등차수열의 합의 마지막 항, input
, 분자+분모
의 관계에 일정한 규칙이 보여서 하나의 변수 i
로 구현할 수 있을 거 같아 고민하다보니 시간이 오래 걸렸다.