알고리즘 문제 풀기

[백준 1193번] 분수찾기 (java)

Solu- 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