문제
자연수 N을 입력하면 N번째 특별한 분수를 찾는 함수를 만들고 싶어합니다. 특별한 분수는 다음과 같은 규칙을 따릅니다.
1/1 -> 1/2 -> 2/1 -> 3/1 -> 2/2 -> 1/3 -> 1/4 -> ...
위와 같이 분자와 분모가 번갈아가면서 증가하는 분수열을 만들고 있습니다. 예를 들어, 2번째 특별한 분수는 1/2, 4번째 특별한 분수는 3/1입니다.
예시
const test_case = 13 // 3/3 출력
풀이
function specialFraction(n) {
let sum = 1;
let count = 1;
while (n > sum) {
count++;
sum += count;
}
let sn = sum - n;
let d = count - sn;
let m = sn + 1;
if (count % 2 === 0) [d, m] = [m, d];
return m + '/' + d;
}
n이 주어졌을 때 카운트가 증가하면서 몇 번째 그룹인지 알아야됩니다. 1/2는 2번째 그룹 3/1는 3번째 그룹입니다.
그룹을 알때까지 총합을 더해주면 그때 n을 빼주면 그룹에서 몇 번째 자리인지 알 수 있습니다.
10일 때 count는 4이고 sn은 0이니 4 그룹 0번째 자리에 있는 수입니다.
그룹에 몇 번째 자리인지 알았으니 count에서 sn을 뺀 수와 sn에서 1을 더한 수 (분자와 분모의 합은 그룹 +1입니다.)
짝수면 분자와 분모를 바꿔 리턴합니다.
다른 푸리
function specialFraction(n) {
let count = 0;
while (n > 0) {
count++;
n -= count;
}
if (count % 2 === 0) return `${count + n}/${1 - n}`;
else return `${1 - n}/${count + n}`;
}
이 로직은 아까는 합한다는 개념이였으면 빼준다는 개념으로 접근하면 됩니다.
1부터 10까지 그룹의 합에서 49의 그룹을 구할때 -55 구하고 +49을 해주면 뒤에서 6번째 순서가 나옵니다.
'코딩문제' 카테고리의 다른 글
K번째로 약수를 찾아라 (0) | 2024.04.07 |
---|---|
사다리 오르내리기 (0) | 2024.04.03 |
방 이동 횟수 구하기 (0) | 2024.04.02 |
동전 거스름돈 계산하기 (0) | 2024.04.01 |
진법 변환 결과 출력 (0) | 2024.04.01 |