본문 바로가기
Beakjoon&프로그래머스/Java

[백준/Java] 1193번 분수찾기

by 현장 2025. 12. 21.

-Code

import java.util.Scanner;

public class BOJ1193 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        System.out.println(solution(n));
    }

    private static String solution(int num) {
        int temp = 0;
        int now = 0;

        while (temp < num) {
            temp += ++now;
        }
        // 방향 전환 조건
        boolean flag = now % 2 == 0;
        // 방향에 따른 row와 col 위치 조정
        int row = flag ? 1 : now;
        int col = !flag ? 1 : now;
        // 이동 방향 셋팅
        int dRow = flag ? 1 : -1;
        int dCol = !flag ? 1 : -1;
        // 이동 횟수
        // 현제 이동하는 줄의 원소 갯수 - 이전 지나간 원소들 -1
        int move = now - (temp - num) - 1;

        row += dRow * move;
        col += dCol * move;

        return row + "/" + col;
    }
}

위와 같이 해결했으나 너무 복잡하게 푼거 같아서 개선 받은 코드로 다시 작성해 봤습니다.

import java.util.Scanner;

public class BOJ1193 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        System.out.println(solution(n));
    }

    private static String solution(int num) {
        int sum = 0;
        int line = 0;
        // sum + line보다 작아야 몇번째 대각선인지 구할수 있음
        while (sum + line < num) {
            sum += line;
            line++;
        }
        // 해당 대각선이 내에서 몇번째인지 확인
        int pos = num - sum;
        // 방향 전환 조건
        int row, col;
        if (line % 2 == 0) {
            // 대각선이 짝수번째인 경우 위에서 아래로
            row = pos; // 몇번째 위치에 따라 변환
            col = line - pos + 1;
        } else {
            // 대각선이 홀수번째인 경우 아래에서 위
            row = line - pos + 1;
            col = pos;
        }

        return row + "/" + col;
    }
}

while 조건문에 line을 더해서 아래 로직에 또 빼는 일을 제거하고 이동 방향을 정해서 *로 계산 했으나 대각선 홀수 짝수에 따라 대각선 위치를 통해 행이나 열중 하나를 바로 구할 수 있었고 다른쪽은 해당 위치를 빼고 +1로 조정하여 더 보기 편하고 좋은 코드로 바꿀 수 있음을 알게 되었습니다.