Algorithm/Baekjoon

[백준 14503] - 자바 / 방향 고려해서 좌표 이동하기

say! 2025. 4. 7. 17:18
728x90

방향 주의하기

후진할 때는 방향 변경 안하는 거임

package solution;

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

// The main method must be in a class named "Main".
class Solution {
    static int N, M;
    static int[][] room;
    static int result = 0;
    
    // 북(0), 동(1), 남(2), 서(3)
    static final int[] dx= {-1,0,1,0};
    static final int[] dy= {0,1,0,-1};
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        
        // 방 크기 입력받기
        st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        room = new int[N][M];
        
        // 처음에 로봇 청소기가 있는 칸
        st = new StringTokenizer(br.readLine());
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());     
        
        // 방 상태 입력받기 > 0인 경우 청소되지 않은 빈 칸, 1인 경우 벽
        for(int i=0; i<N;i++) {
        	st = new StringTokenizer(br.readLine());
        	for(int j=0; j<M;j++) {
        		room[i][j] = Integer.parseInt(st.nextToken());
        	}
        }
        
        // 로봇 청소기 작동하기
        clean(room, a, b, c);
        System.out.println(result);
        
        br.close();
    } //main

    static void clean(int[][] room, int a, int b, int c) {
    	int d = c;
    	int x = a;
    	int y = b;
    	int flag = 0; // 이동했을 경우 1
    	
    	while(true) {
    		
    		// 1. 현재 칸 청소여부 확인
    		if(room[x][y] == 0) {
    			// 현재 칸이 청소 안된 경우 > 현재 칸 청소하기
    			room[x][y] = 2;
    			result++;
    		}
    		
    		flag = 0;
    		// 주변 4칸 확인하기
			for(int i=0; i<4;i++) {
				d = (d + 3) % 4; // 반시계 방향 회전
                int nx = x + dx[d];
                int ny = y + dy[d];
				
                // 3.주변 4칸 중 청소되지 않은 빈칸이 있는 경우
                if(nx >= 0 && ny >=0 && nx <N && ny <M && room[nx][ny] == 0) {
                	// 이동가능 + 청소 안한 칸인 경우 > 이동
                	x = nx;
                	y = ny;
                	flag = 1;
                	break;
                }
			} //for문
			
			// 2. 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우
			if(flag == 0) {
				// 한 칸 후진하기
				int back = (d + 2) % 4;
				int bx = x + dx[back];
				int by = y + dy[back];
				
				// 벽인 경우 작동멈추기
				if(bx < 0 || by < 0 || bx >=N || by >=M || room[bx][by] == 1) {
					break;
				}
				else {
					// 후진하기
					x = bx;
					y = by;
				}
			}
            
    	} //while
    }
}