특별한 분수

문제


자연수 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