백준 자리배정

KIMYEONGJUN·2026년 2월 26일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫 줄에는 공연장의 격자 크기를 나타내는 정수 C와 R이 하나의 공백을 사이에 두고 차례대로 주어진다.
두 값의 범위는 5 ≤ C, R ≤ 1,000이다.
그 다음 줄에는 어떤 관객의 대기번호 K가 주어진다.
단 1 ≤ K ≤ 100,000,000이다.

입력으로 제시된 대기번호 K인 관객에게 배정될 좌석번호 (x,y)를 구해서 두 값, x와 y를 하나의 공백을 사이에 두고 출력해야 한다.
만일 모든 좌석이 배정되어 해당 대기번호의 관객에게 좌석을 배정할 수 없는 경우에는 0(숫자 영)을 출력해야 한다.

내가 이 문제를 보고 생각해본 부분

입력받기: 공연장 가로(C), 세로(R), 대기번호(K)를 읽는다.
좌석 수 확인: 주어진 K가 총 좌석인 C * R보다 크면 배정할 좌석이 없으므로 0을 출력하고 종료한다.
경계 설정:
초기 경계는 left=1, right=C, bottom=1, top=R로 설정한다.
이 경계 안에서 시계방향으로 좌석을 배정한다.
좌표 변수 초기화:
좌석 배정 시작점은 (x,y) = (1,1)
할당 번호는 1부터 시작한다.
배정 과정 반복:
위쪽으로 가능한 만큼 이동(y 증가, x 고정).
경계 상단 top까지.
상단 경계 한 줄을 채웠으니 아래 경계를 올림(left++).
오른쪽으로 가능한 만큼 이동(x 증가, y 고정).
경계 right까지.
오른쪽 경계 한 줄 채운 후 윗 경계를 내림(top--).
아래쪽으로 이동(y 감소, x 고정).
경계 bottom까지.
오른쪽 경계 한 줄 줄임(right--).
왼쪽으로 이동(x 감소, y 고정).
경계 left까지.
아래 경계 한 줄 증가(bottom++).
이런 방식으로 경계를 좁히며 계속 반복한다.
K번째 좌석 도달 시 루프 종료:
변수 count가 K와 같아진 순간 현재 좌표 (x,y)를 출력한다.
출력 후 BufferedReader를 닫는다.

코드로 구현

package baekjoon.baekjoon_33;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 백준 10157번 문제
public class Main1310 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        int C = Integer.parseInt(input[0]); // 가로
        int R = Integer.parseInt(input[1]); // 세로
        int K = Integer.parseInt(br.readLine()); // 대기번호

        // 좌석 총수보다 클 경우 0 출력
        if (K > C * R) {
            System.out.println(0);
            return;
        }

        int left = 1, right = C, bottom = 1, top = R;
        int x = 1, y = 1; // 시작 좌석 좌표
        int count = 1; // 배정 번호 (1부터 시작)

        while (count < K) {
            // 위로 이동
            while (y < top && count < K) {
                y++;
                count++;
            }
            left++;
            if (count == K) break;

            // 오른쪽으로 이동
            while (x < right && count < K) {
                x++;
                count++;
            }
            top--;
            if (count == K) break;

            // 아래로 이동
            while (y > bottom && count < K) {
                y--;
                count++;
            }
            right--;
            if (count == K) break;

            // 왼쪽으로 이동
            while (x > left && count < K) {
                x--;
                count++;
            }
            bottom++;
        }

        System.out.println(x + " " + y);
        br.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글