백준 1193번: 분수찾기 - c언어

Yeonsu Summer·2022년 7월 16일
0

알고리즘

목록 보기
4/24
post-thumbnail
1/11/21/31/41/5
2/12/22/32/4
3/13/23/3
4/14/2
5/1

문제

무한히 큰 배열에 다음과 같이 분수들이 적혀있다.
이와 같이 나열된 분수들을 1/1 → 1/2 → 2/1 → 3/1 → 2/2 → … 과 같은 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자.
X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.

출력

첫째 줄에 분수를 출력한다.

예시

1 > 1/1
2 > 1/2
9 > 3/2
14 > 2/4


나의 생각

표 재정렬

1/11번째(1개)
1/22/12번째(2개)
3/12/21/33번째(3개)
1/42/33/24/14번째(4개)
5/14/23/32/41/55번째(5개)

첫 번째 조건
입력값 = k일 때
f(n) = n(n+1)/2
f(i-1) < k <= f(i)
k는 i번 째에 존재
k는 i번 째 중 (f(i-1) - k)번째에 존재

두 번째 조건

i가 홀수i가 짝수
분자i로 시작 -11로 시작 +1
분모1로 시작 +1i로 시작 -1


입력값 = 11
f(4) < 11 <= f(5)
11은 5번 째에 존재
11은 5번 째 중 1번 째에 존대
5는 짝수
-> 분자: 5, 분모: 1
-> 답: 5/1



제출한 답

#include <stdio.h>

int fraction(int k) {
    return (k * (k + 1) / 2);
}

int main() {
    int X, i, num, num1, num2;
    
    scanf("%d", &X);
    
    for (i = 1; ; i++) {
        if (fraction(i - 1) < X && X <= fraction(i)) {
            num = X - fraction(i - 1);
            break;
        }
    }   
    
    if (i % 2 != 0) {
        num1 = i - (num - 1);
        num2 = num;
    } else {
        num1 = num;
        num2 = i - (num - 1);
    }
    
    printf("%d/%d", num1, num2);
    
    return 0;
}

결과는 맞았습니다!!

profile
🍀 an evenful day, life, journey

0개의 댓글