본문 바로가기

Algorithm/BaekJoon

[1193] 분수찾기

728x90

https://www.acmicpc.net/problem/1193

 

1193번: 분수찾기

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

www.acmicpc.net

 

 

문제

 

 

문제를 잘 못 읽었다 ! 지그제그 인 줄....

 

풀이

 

코드

/*
 * 백준 - 단계별 문제풀이 : 기본수학1
 * 1193번
 *
 * 분수찾기
 * 이와 같이 나열된 분수들을 1/1 → 1/2 → 2/1 → 3/1 → 2/2 → … 과 같은
 * 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자.
 * X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오.
 *
 */

#include <iostream>

using namespace std;

void solution(int x) {

    int m;
    int n = 1;
    int min, max;
    int a, b;

    if (x == 1) {
        cout << "1/1" << "\n";
        return;
    }

    while (true) {

        min = 1 + n * (n - 1) / 2;
        max = n * (n + 1) / 2;

        if (min <= x && max >= x) break;
        n++;

    }

    m = x - min;


    a = 1 + m;
    b = n - m;

    cout << a << "/" << b << "\n";

}

int main() {

    int x;
    cin >> x;

    solution(x);

}

 

 

하지만, 그냥 알고리즘은 비슷하게 생각했고,

그냥 짝수층일 때, 홀수 층일 때 시작지점이 다른 점을 이용해서 다음과 같이 맨 아래에

짝수층일 경우와 홀수 층일 경우 a,b를 변경해 주었다.

/*
 * 백준 - 단계별 문제풀이 : 기본수학1
 * 1193번
 *
 * 분수찾기
 * 이와 같이 나열된 분수들을 1/1 → 1/2 → 2/1 → 3/1 → 2/2 → … 과 같은
 * 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자.
 * X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오.
 *
 */

#include <iostream>

using namespace std;

void solution(int x) {

    int m;
    int n = 1;
    int min, max;
    int a, b;

    if (x == 1) {
        cout << "1/1" << "\n";
        return;
    }

    while (true) {

        min = 1 + n * (n - 1) / 2;
        max = n * (n + 1) / 2;

        if (min <= x && max >= x) break;
        n++;

    }

    m = x - min;

    if (n % 2 == 0) { //짝수 층일 때,
        a = 1 + m;
        b = n - m;
    } else {
        a = n - m;
        b = 1 + m;
    }

    cout << a << "/" << b << "\n";

}

int main() {

    int x;
    cin >> x;

    solution(x);

}

 

궁금한 점

없고 문제를 잘 읽자!

728x90