remagine

알고리즘 풀기 (8) 분수찾기 (보통) 본문

알고리즘

알고리즘 풀기 (8) 분수찾기 (보통)

remagine 2017. 6. 29. 16:24

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

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
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
37
38
39
40
41
42
43
44
45
46
47
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.concurrent.SynchronousQueue;
 
public class Main {
 
    public static void main(String... args) throws NumberFormatException, IOException {
 
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       int test = Integer.parseInt(br.readLine());
       br.close();
       
       ArrayList<Integer> x = new ArrayList<Integer>();
       ArrayList<Integer> y = new ArrayList<Integer>();
       int n = 0;
       int z = 0;
       
       for (int i = 0  ; n < test ; i++){
           
           n += i;
           z = i;
           
       }
             
       
       if(z % 2 == 0){
           for ( int i = 1 ; i <= z ; i++){
               x.add(i);
           }
       }else{
           for ( int i = z ; i > 0 ; i--){
               x.add(i);
           }
       }
       
       int resultX = x.get(test-n+z-1);
       int resultY = x.get(z-test+n-z);
       
       
       System.out.println(resultX + "/" + resultY);
       
    }
 
}
cs



2. 다른 사람 풀이 

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
import java.io.*;
 
class Main {
 
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));       
        int n = Integer.parseInt(br.readLine());
         
        int sum =0;
        int start=0;
        int end=0;
        int x = 1;
        while(sum<n){
            start = sum;
            sum += x;
            end = sum;
            x++;
        }
        int gap = end -start;
        int order = n-start;
        if(gap%2!=1){
            System.out.println(order+"/"+(gap-order+1));
        }else{
            System.out.println((gap-order+1)+"/"+order);
        }
 
    }
 
}
cs


Comments