my study.

Coding Test/Baekjoon

[백준] 14503 로봇 청소기, java

fftl 2023. 4. 3. 20:46
 

14503번: 로봇 청소기

첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$  둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽

www.acmicpc.net

문제 간단 설명

 

보드가 주어지고 로봇청소기가 이동하며 먼지를 청소합니다. 몇칸의 먼지를 청소 할 수 있는치 카운트 하는 문제입니다.


문제 풀이

 

특별한 알고리즘이 필요하다기 보다는 문제에서 주어진 대로 구현하는 문제입니다. 보드 안에서 네 방향의 탐색을 할 수 있다면 풀 수 있는 문제입니다.


코드

package com.baekjoon.gold;

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

public class Main_BJ_14503_G5_로봇청소기 {
	
	static int R, C; //board size
	static int y, x; //로봇 좌표
	static int d;
	static int[] dy = {-1, 0, 1, 0};
	static int[] dx = {0, 1, 0, -1};
	static int[][] board;
	
	public static void main(String[] args) throws Exception{
		//입력 정보
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		R = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());
		
		st = new StringTokenizer(br.readLine());
		y = Integer.parseInt(st.nextToken());
		x = Integer.parseInt(st.nextToken());
		d = Integer.parseInt(st.nextToken());
		
		board = new int[R][C];
		
		//board 채워주기
		for (int i = 0; i < R; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < C; j++) {
				board[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		//결과가 될 res
		int res = 0;
		
		//종료조건을 만나면 멈춰주기 위한 run 입니다.
		boolean run = true;
		while(run) {
			
			//1.청소되지 않은칸이면 청소하기 (현재 도착한 칸이 0이라면 청소한 칸수를 1 증가시키고 청소된 뜻으로 2라고 지정해줍니다. )
			if(board[y][x] == 0) {
				res++;
				board[y][x] = 2;
			}
			
			//그리고 4방향을 한번씩 바라보며 하나라도 청소되지 않은 빈칸이 있는지 확인하여
			//check에 표시해줍니다.
			boolean check = false;
			for (int i = 0; i < 4; i++) {
				int ny = y+dy[i];
				int nx = x+dx[i];
				if(0<=ny && ny<R && 0<=nx && nx<C) {
					if(board[ny][nx] == 0) check = true;
				}
			}
			
			//3. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는 경우
			if(check) {
				//반시계방향으로 로봇의 머리를 회전시켜 준 뒤
				if(0<d) d -= 1;
				else d = 3;
				
				//해당의 앞 방향이 청소되지 않은 빈 칸인지 판단합니다.
				int ny = y+dy[d];
				int nx = x+dx[d];
				if(0<=ny && ny<R && 0<=nx && nx<C) {
					
					//만약 해당 방향이 청소되지 않은 빈 칸인경우 해당 위치로 로봇의 위치를 이동시킵니다.
					if(board[ny][nx] == 0) {
						y = ny;
						x = nx;
					}
				}
				
			//2. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우
			} else {
				
				//현재 로봇 머리방향의 반대 방향을 찾아 val에 담아줍니다.
				int val = -1;
				if(d<2) val = d+2;
				else val = d%2;
				
				//로봇의 후진 방향으로 한칸 이동해본 뒤 1(벽)이 아닌경우 이동해주고
				//만약 1이라면 run을 false로 바꾸어 이동을 멈춰줍니다.
				int ny = y+dy[val];
				int nx = x+dx[val];
				if(0<=ny && ny<R && 0<=nx && nx<C) {
					if(board[ny][nx] != 1) {
						y = ny;
						x = nx;
					} else {
						run = false;
					}
				}
			}
		}
		
		//위의 while이 끝나면 나온 결과를 출력해줍니다.
		System.out.println(res);
	}
}

'Coding Test > Baekjoon' 카테고리의 다른 글

[백준] 14891 톱니바퀴, java  (0) 2023.04.06
[백준] 14888 연산자 끼워넣기, java  (0) 2023.04.04
[백준] 14499 주사위 굴리기, java  (0) 2023.04.02
[백준] 2096 내려가기, java  (0) 2022.12.19
[백준] 9019 DSLR, java  (0) 2022.12.14