강연장에는 가로 c개, 세로 r개의 좌석이 c×r 격자 형태로 배치되어 있으며, 각 좌석은 (x, y) 좌표로 표시됩니다. 사람들은 (1, 1) 좌석부터 시작하여 시계 방향으로 돌아가며 빈 좌석에 차례대로 앉습니다. 강연장의 크기 (c, r)와 몇 번째 사람 k가 주어졌을 때, k번째로 온 사람이 앉을 좌석 번호를 반환하는 프로그램을 작성하는 것이 문제입니다. 만약 k번째 사람이 앉을 좌석이 없다면 [0, 0]을 반환합니다.
class ChairNumber {
public int[] solution(int c, int r, int k) {
int[] answer = new int[2];
int[] dx = {0, 1, 0, -1};
int[] dy = {1, 0, -1, 0};
int maxX = c-1, maxY = r-1, minX = 0, minY = 0, d = 0;
for (int i = 0; i < c*r; i++) {
if(i==k-1) {
answer[0]++;
answer[1]++;
return answer;
}
if (d == 0 ) {
if (answer[1] == maxY) {
minX++;
d = 1;
}
}
else if (d == 1) {
if (answer[0] == maxX) {
maxY--;
d = 2;
}
}
else if (d == 2 ) {
if (answer[1] == minY) {
maxX--;
d = 3;
}
}
else if (d == 3 ) {
if (answer[0] == minX) {
minY++;
d = 0;
}
}
answer[0] += dx[d];
answer[1] += dy[d];
}
return new int[2];
}
}