슈콩

[BOJ] 백준 14503 로봇 청소기 본문

Algorithms/Baekjoon

[BOJ] 백준 14503 로봇 청소기

shukong 2025. 9. 22. 20:54

[문제]

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

 

 

[소스 코드]

import java.io.*;
import java.util.*;
public class Main {
	static int n,m;
	static int[][] map;
	static int result = 0;
	static int[] dr = {-1,0,1,0};
	static int[] dc = {0,1,0,-1};
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		map = new int[n][m];
		st = new StringTokenizer(br.readLine());
		int sr = Integer.parseInt(st.nextToken());
		int sc = Integer.parseInt(st.nextToken());
		int dir = Integer.parseInt(st.nextToken());
		for(int i=0;i<n;i++) {
			st = new StringTokenizer(br.readLine());
			for(int j=0;j<m;j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		clean(sr,sc,dir);
		System.out.println(result);
	}
	private static void clean(int sr,int sc,int dir) {
		if(map[sr][sc]==0) {
			map[sr][sc] = 2;
			result++;
		}
		int cnt = 0;
		for(int d=0;d<4;d++) {
			int nr = sr + dr[d];
			int nc = sc + dc[d];
			if(nr>=0 && nr<n && nc>=0 && nc<m && map[nr][nc]==0) cnt++;
		}
		if(cnt==0) {
			int newDir = (dir+2)%4;
			int nr = sr + dr[newDir];
			int nc = sc + dc[newDir];
			if(nr>=0 && nr<n && nc>=0 && nc<m && map[nr][nc]!=1) {
				clean(nr,nc,dir);
			}
			else {
				return;
			}
		}
		else {
			int newDir = dir;
			for(int i=0;i<4;i++) {
				newDir = (newDir+3)%4;
				int nr = sr + dr[newDir];
				int nc = sc + dc[newDir];
				if(nr>=0 && nr<n && nc>=0 && nc<m && map[nr][nc]==0) {
					clean(nr,nc,newDir);
					return;
				}
			}
		}
	}
}

'Algorithms > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 2467 용액  (0) 2025.09.22
[BOJ] 백준 14888 연산자 끼워넣기  (0) 2025.09.22
[BOJ] 백준 2143 두 배열의 합  (2) 2025.09.21
[BOJ] 백준 2110 공유기 설치  (0) 2025.09.20
[BOJ] 백준 18869 멀티버스 Ⅱ  (0) 2025.09.20