ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 1193번] 분수찾기 (java)
    알고리즘 문제 풀기 2021. 4. 15. 15:02

    링크

    나의 풀이

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main {
        public static void main(String[] args) {
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            //String s = "";  // 입력받는 문자열
            int x = 1; // 1 ≤ X ≤ 1,000,000,000
            int result = 0;
            int lineNumber = 0;
            int sum = 0;    // sum = 1 + 2 + 3 + ... + lineNumber까지의 합
            boolean flag = true;
            int row = 0;    // 열
            int col = 0;    // 행
            try {
                //s = bf.readLine();
                x = Integer.parseInt(bf.readLine());
    
            } catch (IOException e) {
                System.out.println(e);
            }
    
            // 배열의 대각선의 합은 일정함.
            // 이를 통해서 위치 값을 알아내기로 하였음
            // X가 어디에 있는지 좌측부터 lineNumber 번째 대각선 중에 찾아냄
            while(true) {
                lineNumber++;
                sum += lineNumber;
    
                if (x <= sum) {
                    break;
                }
            }
            // 대각선의 방향에 따라 달리 계산
            if (lineNumber % 2 == 0) {
                // 짝수일 때 == 남서쪽으로 진행하는 경우
                col = sum - x;
                row = (lineNumber - 1) - col;
    
            }
            else {
                // 홀수일 때 == 북동쪽으로 진행하는 경우
                row = sum - x;
                col = (lineNumber - 1) - row;
            }
    
            // index 기준으로 계산했으므로, 문제 결과에 맞게 각각 1씩 더함
            System.out.println(++row + "/" + ++col);
        }
    }
    

    0,0 부터 N,N까지의 index로 생각하고 문제를 풀었다. 문제에서는 1/1부터 시작하기 때문에 헷갈리면서 풀었다.
    각 위치마다 대각선을 그었을 때, 각 row와 col 합은 일정하다. 이것을 이용하여, x가 몇 번째 대각선의 위치에 있는지 확인한다.

    lineNumber = 0;    // 좌표 : (0,0)                    // x = 1
    lineNumber = 1: // 좌표 : (0,1), (1,0)            // x = 2, 3
    lineNumber = 2; // 좌표 : (0,2), (1,1), (2,0)        // x = 4, 5, 6

    lineNumber가 1씩 증가할 때, x의 위치는 (1 + 2 + ... + lineNumber) 와 (1 + 2 + ... + lineNumber + (lineNumber + 1)) 사이에 있다.
    이를 이용하여, X가 위치하는 대각선을 찾고, 대각선의 진행 방향(lineNumber가 짝수/홀수에 따라 진행방향이 다르다)에 따라 좌표 값을 계산해 주었다.

    내가 생각한 다른 사람 모범 답안

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    
    public class Main { 
        public static void main(String[] args) throws IOException {
    
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            StringBuffer sb = new StringBuffer();
    
            int n = Integer.parseInt(br.readLine());
            int a = 1;
    
            while(n > a) {
                n -= a++;
            }
    
            if(a % 2 == 0) {
                sb.append(n).append("/").append(a+1 -n);            
            }else {
                sb.append(a+1 -n).append("/").append(n);
            }
    
            bw.write(sb.toString());        
            bw.flush();
    
            br.close();
            bw.close();    
        }
    }

    a라는 변수를 통해 같은 방식으로 처리한듯 하다. 다만, s코드가 더 간결하고 실행 속도도 빠르다.

    실행 결과

    • 내 코드 : 165ms
    • 모범 답안 : 128ms
Designed by Tistory.