알고리즘/BJ

[BJ] 10157 자리배정 (JAVA)

9_yoon 2022. 2. 19. 23:59
728x90
반응형

문제

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

풀이 방법

1. 기저 조건: 찾고자 하는 대기 번호를 찾으면 출력 후 리턴
2. 좌석 배정하기 
3. 다음 좌석위치로 업데이트 후 범위와 좌석 배치가 되어있는지 확인하기 
4. 배치 가능하면 재귀 호출 
5. 배치 불가능하면 방향 + 1 한 뒤 다시 위치 업데이트 후 재귀 호출
식으로 구현했다. 

제출 코드

package day_0219;

import java.util.Scanner;

public class BJ_10157_자리배정 {
	public static int[][] move = {{1,0},{0,1},{-1,0},{0,-1}};
	public static boolean[][] isSeated;
	public static int C, R, K;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
	
		 C = sc.nextInt(); //열
		 R = sc.nextInt(); //행
		 K = sc.nextInt(); //대기 번호
		
		isSeated = new boolean[R][C];
		
		if(K > C * R) {
			System.out.println(0);
		}else {
			seating(0, 0, 1, 0);
		}
	}
	private static void seating(int i, int j, int k, int dir) { //현재 좌석 위치 i, j, 현재 대기번호, 방향
		if(k == K) { //기저 조건 , 찾고자하는 대기 번호면 출력
			System.out.print((j+1)+" "+(i+1)); //인덱스가 0부터 시작하므로 1더해주기
			return;
		}
		isSeated[i][j] = true; //좌석 사용중 표시
		
		//좌석 위치 업데이트 
		int p =i+move[dir][0];
		int q =j+move[dir][1];
		
		if( p >=0 && p < R  && q >=0  && q <C && !isSeated[p][q]) {
			seating(p, q, k+1, dir);
		}else { //범위에서 벗어나고 이미 누가 자리에 있다면 방향 바꾸기
			dir = (dir+1)%4; 
			p =i+move[dir][0];
			q =j+move[dir][1];
			seating(p, q, k+1, dir);
		}
		
	}
}

 

728x90
반응형
댓글수0