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

문제의 그림은 이렇게 나와있지만

저는 편의를 위해 이렇게 옆으로 회전시켜서 구현하였습니다.
그 다음 (x, y) = (0, 0)으로 초기값을 잡고 시뮬레이션을 돌렸습니다.
진행방향은 오른쪽 -> 아래쪽 -> 왼쪽 -> 위쪽 순서입니다.
(nx ,ny)이 맵 밖으로 나가거나 방문한 좌표면 방향을 바꿔주고 다시 돌려줍니다.
이 과정에서 번호가 K에 도달하면 좌표를 출력해줍니다.
좌석은 N * M개 있으므로 만약 K가 N * M보다 크면 0을 출력하고 그냥 리턴시켜줍니다.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main {     static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));     static StringTokenizer st;     static boolean visit[][];     static int direct[][] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };     static int N, M, K;     static void func() {         if (K > N * M) {             System.out.println(0);             return;         }         int x = 0;         int y = 0;         int idx = 0;         for (int k = 1; k <= N * M; k++) {             visit[x][y] = true;             if (k == K) {                 System.out.println((x + 1) + " " + (y + 1));                 return;             }             int nx = x + direct[idx][0];             int ny = y + direct[idx][1];             if (nx < 0 || ny < 0 || nx >= N || ny >= M || visit[nx][ny]) {                 idx = (idx + 1) % 4;                 nx = x + direct[idx][0];                 ny = y + direct[idx][1];             }             x = nx;             y = ny;         }     }     static void input() throws Exception {         st = new StringTokenizer(br.readLine());         N = Integer.parseInt(st.nextToken());         M = Integer.parseInt(st.nextToken());         st = new StringTokenizer(br.readLine());         K = Integer.parseInt(st.nextToken());         visit = new boolean[N][M];     }     public static void main(String[] args) throws Exception {         input();         func();     } } | cs | 
'algorithm > Implementation' 카테고리의 다른 글
| boj 20055 컨베이어 벨트 위의 로봇 (0) | 2021.02.23 | 
|---|---|
| boj 2331 반복수열 (0) | 2021.02.23 | 
| boj 16918 봄버맨 (0) | 2021.02.17 | 
| boj 16935 배열 돌리기 3 (0) | 2021.02.10 | 
| boj 1914 하노이 탑 (0) | 2021.02.07 |