[백준 10157] 자리배정
알고리즘/백준

[백준 10157] 자리배정

www.acmicpc.net/problem/10157

 

10157번: 자리배정

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

www.acmicpc.net

1. 유형 : 구현

2. 설명 : 흔한 달팽이 문제다. 시작좌표를 설정하고, 동서남북의 바운더리를 설정해준다.

밑에 그림처럼 처음엔 파랑색, 노랑색, 녹색, 보라색 순으로 한 사이클을 탐색한다.

저것을 target을 찾을 때까지 반복한다.

3. 코드

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

public class 자리배정10157 {
	static int w,h,k;
	public static void main(String[] args) throws IOException {
		init();
		go();
	}
	static void init() throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine(), " ");
		w=Integer.valueOf(st.nextToken());
		h=Integer.valueOf(st.nextToken());
		k=Integer.valueOf(in.readLine());
	}
	//바운더리를 설정
	static void go() {
		int cnt = 1;
		int sx = 1;
		int sy = 1;
		int a = h, b=w, c=1, d=2;
		if(h*w<k) {
			System.out.println(0);
			return;
		}
		out:while(true) {
			//상
			for (int i = sy; i < a; i++) {
				if(cnt==k) break out;
				else if(cnt<k) {
					cnt++;
					sy++;
				} 
			}
			a--;
			for (int j = sx; j < b; j++) {
				if(cnt==k) break out;
				else {
					cnt++;
					sx++;
				}
			}
			b--;
			for (int i = sy; i > c ; i--) {
				if(cnt==k) break out;
				else {
					cnt++;
					sy--;
				}
			}
			c++;
			for (int j = sx; j > d; j--) {
				if(cnt==k) break out;
				else {
					cnt++;
					sx--;
				}
			}
			d++;
		}
		System.out.println(sx+" "+sy);
	}
}

 

시작위치와 동서남북 바운더리 설정

int cnt = 1;
int sx = 1;
int sy = 1;
int a = h, b=w, c=1, d=2;

문제에서 처음은 위로 증가하도록 되어있다. 높이가 6이라면 5까지만 갈 수 있음

(바운더리 설정)

//상
for (int i = sy; i < a; i++) {
  if(cnt==k) break out;
    else if(cnt<k) {
    cnt++;
    sy++;
  } 
}
a--;