본문 바로가기
Algorithm/Baekjoon

백준 1193번

by minhi 2025. 1. 10.

백준 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 (조건)으로 불필요하게 복잡하게 작성하지 말자.

'Algorithm > Baekjoon' 카테고리의 다른 글

백준 5086번  (0) 2025.01.13
백준 2869  (0) 2025.01.10
백준 2292번  (0) 2025.01.10
백준 2720번  (0) 2025.01.10
백준 2903번  (1) 2025.01.09