코딩테스트/백준

[백준]10157번 자리배정 - Java

GAEBAL 2022. 2. 18. 23:27
728x90

문제

https://www.acmicpc.net/problem/10157

 

10157번: 자리배정

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

www.acmicpc.net

 

풀이

1. 처음 방향(상)에서 범위를 벗어나면 방향이 바뀜(우) -> 암튼 상우하좌 로 방향이 바뀜 -> static으로 방향 벡터 설정

2. 문제에서 말이 되지 않는 케이스는 0을 출력하라고 함 -> 0을 출력 후 System.exit(0)으로 시스템 정상 종료

3. 범위를 벗어나거나 map[][] 안에서 0을 만나면 방향을 바꾸고 한칸 전진 시키고 다시 while문

4. 시뮬레이션 문제 풀때 쓰는 2차원 배열 인덱스와 문제에서 요구하는 인덱스가 다르므로 계산하여서 답을 출력(은근히 헷갈림)

 

코드

// 10157번 자리배정
// https://www.acmicpc.net/problem/10157

package BAEKJOON;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Num10157_자리배정 {
    static int C, R, K;
    static int[][] map;
    static int count = 1;
    // 상우하좌
    static int[] dr = {-1, 0, 1, 0};
    static int[] dc = {0, 1, 0, -1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        C = Integer.parseInt(st.nextToken());
        R = Integer.parseInt(st.nextToken());

        K = Integer.parseInt(br.readLine());

        map = new int[R][C];

        if (K > C * R) {
            System.out.println(0);
            System.exit(0); // 말이 안되는 케이스면 시스템 종료
        }

        int r = R - 1;
        int c = 0;
        int dir = 0;

        // 얘는 다 찍는거지만
//        while (count != C * R + 1) {

        // 얘는 정답 나올때까지만 찍는거. 더 빠름. 근데 왜안빠르지
        while (count != K + 1) {
            map[r][c] = count;
            int nr = r + dr[dir];
            int nc = c + dc[dir];

            // 범위를 벗어났으면
            if (nr < 0 || nr >= R || nc < 0 || nc >= C || map[nr][nc] != 0) {
                // 방향을 바꾸고
                dir++;
                if (dir == 4) {
                    dir = 0;
                }
                // 바꾼 방향으로 한칸가고
                nr = r + dr[dir];
                nc = c + dc[dir];
            }
            r = nr;
            c = nc;
            count++;
        }


        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (map[i][j] == K) {
                    sb.append(j + 1).append(" ").append(R - i);
                    break;
                }
            }
        }

//        // 테스트
//        for (int i = 0; i < R; i++) {
//            System.out.println(Arrays.toString(map[i]));
//        }


        System.out.println(sb);
    }
}
728x90