카테고리 없음
[ 백준 10157 ] 자리배정
agong이
2025. 4. 15. 23:59
난이도 : S3
Link : https://www.acmicpc.net/problem/10157
Tag : 시뮬레이션/구현
문제 탐색하기
- 달팽이 처럼 순서대로 자리를 배정할 때 특정 k번째의 사람이 어디에 위치 하냐
시도 1 ( 성공 😲)
시간복잡도⏰
차례대로 모든 위치를 배정하면 가능합니다.
숫자 k는 최대 1억으로 매우 큰 숫자이지만 C, R은 1000이하로 제한되어있으므로 모든 사람들을 배정한다 하더라도
1000*1000 = 1,000,00 로 시간내에 해결할 수 있습니다. 또한 만약 C*R의 좌석 크기보다 K가 크다면 0으로 바로 출력할 수 있습니다.
시간복잡도 계산
모든 자리를 배정하다가 k번째 되면 해당 위치를 출력해주면 됩니다. 최악의 경우 C*R번째의 사람의 위치를 출력하는 것이기 때문에 최대 자리 크기 C*R = 1,000,000 으로 시간내에 해결할 수 있을것입니다.
구현 방법
세부 구현 사항
1. 주어진 값들을 입력 받습니다.
2. 반복해서 해당 방향으로 이동시킨다.
3. 만약 이미 방문 했거나, 크기를 벗어날 경우 방향을 틀어서 다시 이동시킨다.'
import java.io.IOException;
import java.util.*;
class Main {
private static int[] dirX = { 0, 1, 0, -1 };
private static int[] dirY = { 1, 0, -1, 0 };
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int c = sc.nextInt();
int r = sc.nextInt();
int k = sc.nextInt();
if (k > c * r) {
System.out.println(0);
return;
}
int[][] visit = new int[r][c];
int dir = 0;
int x = 0;
int y = 0;
int now = 1;
visit[y][x] = 1;
while (now < k) {
int dx = x + dirX[dir];
int dy = y + dirY[dir];
if (dx < 0 || dx >= c || dy < 0 || dy >= r || visit[dy][dx] == 1) {
dir = (dir + 1) % 4;
} else {
now++;
x = dx;
y = dy;
visit[y][x] = 1;
}
}
System.out.println((x + 1) + " " + (y + 1));
}
}
문제에서는 가장 밑에서부터 자리를 배치하여 왼쪽 밑이 (1,1)로 시작되었지만 구현상 편의를 위해 뒤집어서 (1,1)이 왼쪽 위에서 시작되도록 구현하였습니다. 결과는 변화 없습니다.
마무리
구현은 난이도가 올라갈 수록 급격하게 어려워지는 것 같습니다.
요즘 중요하게 여기는 문제 유형인만큼 많은 연습이 필요할 것 같습니다.