백준 1193번을 풀어보았다.
분자, 분모의 합이 동일한 분수들이 대각선으로 같은 줄에 놓여있다는 점을 토대로
번째수와 분자, 분모의 합 간의 관계를 살펴보았다.
1번째 분수는 합이 2, 2~3번째 분수는 합이 3, 4~6번째 분수는 합이 4, 7~10번째 분수는 합이 5이다.
1 = 1 (합 2)
3 = 1 + 2 (합 3)
6 = 1 + 2 + 3 (합 4)
10 = 1 + 2 + 3 + 4 (합 5)
...
와 같은 규칙이 있다.
위와 같은 규칙을 토대로 X번째 분수의 분자, 분모의 합(sum)을 구하고
합이 동일한 범위의 마지막 번째(cnt)에서 X번째가 몇 번째 앞인지 구해 구체적인 분자, 분모를 알아낸다.
let X = require('fs').readFileSync('/dev/stdin').toString()
X = Number(X)
let cnt = 1, sum = 2
while (true) {
if (cnt < X) {
cnt += sum
sum += 1
continue
}
break
}
let denominator = 1, numerator = 1
if (sum % 2 !== 0) {
denominator += cnt - X
numerator = sum - denominator
} else {
numerator += cnt - X
denominator = sum - numerator
}
console.log(numerator + '/' + denominator)
위 코드에서 while (true) { if (cnt < X) 부분은 다음과 같이 수정할 수도 있다.
let X = require('fs').readFileSync('/dev/stdin').toString()
X = Number(X)
let cnt = 1, sum = 2
while (cnt < X) {
cnt += sum
sum += 1
}
let denominator = 1, numerator = 1
if (sum % 2 !== 0) {
denominator += cnt - X
numerator = sum - denominator
} else {
numerator += cnt - X
denominator = sum - numerator
}
console.log(numerator + '/' + denominator)
참고) 백준 2292번
💫 이 문제를 통해 배운 것
• while (조건)을 while (true) { if (조건)으로 불필요하게 복잡하게 작성하지 말자.