devlog

[BOJ] 백준 1193 분수찾기-java 본문

Algorithm/BOJ

[BOJ] 백준 1193 분수찾기-java

bellaah 2018. 12. 4. 14:34

문제

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

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)가 주어진다.

출력

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

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int num=in.nextInt();
        int tmp=0,divisor=0,dividend=0;
        for(int i=1; i<10000; i++) {
            if(num>tmp && tmp+i>=num) {
                if(i%2==0) {
                    divisor=i+1-(num-tmp);
                    dividend=(num-tmp);    
                }
                else {
                    divisor=(num-tmp);
                    dividend=i+1-(num-tmp);
                }
                break;
            }
            tmp+=i;
        }
        System.out.print(dividend+"/"+divisor);
    }
}
cs

 

풀이

숫자를 입력받아서 1/1부터 지그재그로 숫자를 읽을 때 입력받은 num번째에 있는 분수를 출력해야 합니다.

일단 지그재그로 읽을 때 첫번째엔 1/1 하나이고 두번째 대각선은 1/2,2/1 이렇게 두개, 세번째 대각선은 3/1,2/2,1/3 이렇게 세개입니다.

이렇게 대각선 하나에 속하는 분수가 한개씩 늘어나므로 한 대각선에 속하는 분수의 개수는 1, 2, 3, 4, 5... 이런식으로 등차수열이 됩니다.

따라서 입력받은수가 14이면 5번째 대각선에 속하며 1+2+3+4+ 4이죠.

그럼 5번째 대각선에 4번째 분수를 출력하게 되면 됩니다.

대각선은 지그재그로 읽기때문에 i번째 대각선은 오른쪽상단부터 내려오면서 읽는지 왼쪽하단부터 올라오면서 읽는지 봐야하는데 i가 짝수이면 위에서 부터 읽고 홀수이면 밑에서 부터 읽습니다.

그래서 if(i%2==0)라는 조건을 걸어주었습니다.

tmp에는 앞에 있는 분수의 개수를 카운트하고 num이 5번째 대각선에 있는 분수라면 num은 1+2+3+4+?일 것이므로 tmp보다는 크고 tmp+i보다는 같거나 작을 것 입니다.

그러니 1~n-1까지의 숫자를 다 더한뒤 num에서 그 수를 빼면 n번째 대각선에 몇번째에 있는지 알 수 있는데 n이 짝수인지 홀수인지 판별하고 짝수이면 분모가 n이고 분자가 1로 시작해서 대각선으로 내려갈수록 분모는 1씩 작아지고 분자는 1씩 커집니다.

홀수이면 그 반대입니다.

이렇게 분모와 분자를 각각 구해서 출력해줍니다.

Comments