ALGORITHM/BOJ

[백준] 1193 분수찾기

0298 2022. 2. 6. 22:18

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

 

1193번: 분수찾기

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

www.acmicpc.net

2022-02-06


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main1193 {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(bf.readLine().trim());
        int X = Integer.parseInt(st.nextToken());
 
        StringBuilder sb = new StringBuilder();
 
        int T = 1// 라인
        int base = 1// 기준 번호
 
        while(true) {
            if(X >= base && X < base+T) {
                // (분모+1)/(분자-1)
                if(T % 2 == 0) { //라인이 짝수 : 기준 번호가 기준부터 오름차순
                    sb.append((1+(X-base))).append("/").append((T-(X-base)));
                    break;
                } else { // 라인이 홀수 : 기준번호 + T 부터 내림차순
                    int tmp = base + T - 1;
                    sb.append(1+(tmp-X)).append("/").append(T-(tmp-X));
                    break;
                }
            } else {
                base += T;
                T++;
            }
        }
 
        System.out.println(sb.toString());
    }
}
cs

#문제풀이

base라는 기준 숫자를 기준으로 대각선 한 줄에 X가 속해져있는지 먼저 찾은 후, 그 범위를 찾으면 짝수/홀수 경우의 수를 나눠서 계산했다.

짝수는 base를 기준으로 홀수는 base+T-1을 기준으로 해당번호를 찾아서 분모, 분자를 찾았다.

 

 

다른 사람 풀이를 보다보니 조금 더 간단한 방법이 있었다.

 

주어진 수 X를 기준으로 num++을 빼면서(각 라인에 있을 수 있는 숫자의 총 갯수) 어떤 라인에 있는지 체크하고 그 라인의 몇 번째인지 바로 계산할 수 있었다.

그리고, 짝수의 경우 위에서부터 카운팅해서 분모가 X, 분자가 (num+1-X)가 되고,

홀수의 경우 아래에서부터 카운팅해서 분자가 (num+1-X), 분모가 X가 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main1193_2 {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(bf.readLine().trim());
        int X = Integer.parseInt(st.nextToken());
 
        StringBuilder sb = new StringBuilder();
 
        int num = 1// 카운트
 
        while(X > num) {
            X -= num++;
        }
        if(num % 2 == 0) {
            sb.append(X).append("/").append(num+1-X);
        } else {
            sb.append(num+1-X).append("/").append(X);
        }
 
 
        System.out.println(sb.toString());
    }
}
cs