PS/백준

[백준] - 자리배정 10157

팡세영 2022. 11. 6. 22:55

 


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

 

10157번: 자리배정

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

www.acmicpc.net


  • 시계방향으로 배열을 초기화 시켜준다.  
  • 배열의 범위를 벗어나거나 이미 자리가 배정된 경우 방향을 전환해준다.
  • 자리 배정이 끝나면 대기 순서가 K인 자리(x, y)를 찾아 출력한다.

[Java]

import java.io.*;
import java.util.*;


public class Main {

    // 위, 오른쪽, 아래쪽, 왼쪽 순으로 방향을 전환 (시계방향)
    static int dx[] = {0, 1, 0, -1};
    static int dy[] = {-1, 0, 1, 0};
    
    // 방향을 전환할 시기에 배열의 범위를 벗어나게 되는데
    // 방향에 맞게 적절한 위치로 초기화 시켜주기 위한 배열
    // ex) 위 -> 오른쪽 전환할 시기에 y: -1, 오른쪽 -> 아래쪽 x: m
    //     아래쪽-> 왼쪽 y: n, 왼쪽 -> 위: x: -1
    static int change_dx[] = {1, 0, -1, 0};
    static int change_dy[] = {0, 1, 0, -1};

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

        int m = Integer.parseInt(st.nextToken());   // 열
        int n = Integer.parseInt(st.nextToken());   // 행
        int target = Integer.parseInt(br.readLine());

        int arr[][] = new int[n][m];

        int num = 1;
        int moveIdx = 0;

        int curY = n-1;
        int curX = 0;


        while(num <= n*m){

            if(curY >= n || curY < 0 || curX >= m || curX <0 || arr[curY][curX] != 0) {
                moveIdx++;
                curY += change_dy[moveIdx%4];
                curX += change_dx[moveIdx%4];
            }
            else arr[curY][curX] = num++;

            curY += dy[moveIdx % 4];
            curX += dx[moveIdx % 4];


        }

        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                if(arr[i][j] == target){
                    bw.write((j+1) + " " + (n-i));
                    bw.flush();
                    return;
                }
            }
        }

        bw.write("0");
        bw.flush();

    }
}