
내가 생각했을때 문제에서 원하는부분
첫 줄에는 공연장의 격자 크기를 나타내는 정수 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();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.