본문 바로가기
Problem Solving/BOJ

[백준] 1193번 - 분수찾기

by 테리는당근을좋아해 2020. 1. 7.

문제 >

무한히 큰 배열에 다음과 같이 분수들이 적혀있다.

1/1 1/2 1/3 1/4 1/5
2/1 2/2 2/3 2/4
3/1 3/2 3/3
4/1 4/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, 2/1 }, { 3/1, 2/2, 1/3 }, ...이런 방식으로 나열된다.

i 번째 대각선은 a[i] = a[i-1] + 1 번째의 분수를 포함함으로 a[i-1] < x <= a[i]를 만족하는 대각선을 찾고

부분집합의 각 원소가 갖는 규칙을 찾아낸다.

 

c++

#include <iostream>

using namespace std;

int main(){
    int num;
    int sum = 1, size = 1;
    int st;
    int s;
    int i = 2;
    cin >> num;

    if(num == 1){
        cout << "1/1" <<'\n';
        return 0;
    }
    while(1){
        if(num > sum && num <= sum + i){
            st = i;
            s = (sum + i) - num;
            break;
        }
        sum += i;
        i++;
    }
    if(st % 2 == 1){
        cout << s + 1 << '/' << st - s << '\n';
    }else{
        cout << st - s << '/' << s + 1 << '\n';
    }
}

 

java

package baekjoon;

import java.util.*;

public class BOJ_1193 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int x = sc.nextInt();
		String s;
		int a = 1;
		int idx, dif;
		
		for(int i = 1; ;i++) {
			if(x <= a) {
				idx = i;
				dif = a - x;
				break;
			}
			a = a + (i+1);
		}
		if(idx % 2 != 0) {
			s = (dif + 1) + "/" + (idx - dif);
		}
		else
			s = (idx - dif) + "/" + (dif + 1);
		System.out.println(s);
	}
}

 

 

문제링크 >

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

 

1193번: 분수찾기

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

www.acmicpc.net

 

'Problem Solving > BOJ' 카테고리의 다른 글

[백준] 1712번 - 손익분기점  (0) 2020.01.07
[백준] 1427번 - 소트인사이드  (0) 2020.01.07
[백준] 1181번 - 단어 정렬  (0) 2020.01.07
[백준] 1085번 - 직사각형에서 탈출  (0) 2020.01.07
[백준] 1026번 - 보물  (0) 2020.01.07

댓글