티스토리 뷰

728x90

문제

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

 

10157번: 자리배정

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

www.acmicpc.net

 

풀이 및 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

class Main {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		st = new StringTokenizer(br.readLine());
		int m = Integer.parseInt(st.nextToken()); //가로, 열
		int n = Integer.parseInt(st.nextToken()); //세로, 행
		int k = Integer.parseInt(br.readLine());
		if(k==1) { //첫번째 관객일 경우
			System.out.println("1 1");
			System.exit(0);
		}
		if(m*n<k) { //배정할 수 없는 경우
			System.out.println("0");
			System.exit(0);
		}
		int[][] arr = new int[n][m];
		
		int[] dx = {1, 0, -1, 0};
		int[] dy = {0, 1, 0, -1};
		int x = 0;
		int y = 0;
		int cnt = 1;
		arr[x][y] = 1;
		outer: while(true) {
			for(int i=0;i<4;i++) {
				while(true) {
					x = x+dx[i];
					y = y+dy[i];
					if(0>x||n<=x||0>y||m<=y) {
						x = x-dx[i];
						y = y-dy[i];
						break;
					}
					if(arr[x][y]!=0) {
						x = x-dx[i];
						y = y-dy[i];
						break;
					}
					arr[x][y] = ++cnt;
					
					if(cnt==k) {
						System.out.println((y+1)+" "+(x+1));
						break outer;
					}
				}
			}
		}
	}
}
반응형