[Java] 백준 14503번 로봇 청소기

2022. 4. 14. 21:01
728x90

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

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net

이번 문제는 dfs를 이용하여 풀었습니다.

처음에는 아 그냥 방향만 잘 설정해서 청소하고 visit배열만 체크 잘해주면 쉽게 풀린다고 생각하여 문제도 제대로 안읽고 풀었다가 시간을 좀 쓴 문제였습니다.

후진과 벽이 있을 경우 작동이 멈춘다니.....;;

문제를 제대로 읽어야합니다!!!

 

다 풀고 나서 보니 좀더 쉽게 풀 수 있는 문제였습니다.

좀 생각을 안하고 풀었는데 저는 방향별 노가다로 청소구역을 일일이 다 설정했는데

이렇게 푸는 것 보다 dx와 dy배열을 사용하여 이동 경로를 미리 설정해두고 (방향 + 3)%4를 해주면 쉽게 풀 수 있었을 것이라고 생각이 듭니다.

 

저는 이미 풀어서 귀찮아서 좀 노가다 한 것으로 올리겠습니다.

 

package BJ;

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

public class BJ_로봇청소기 {
	static int N, M;
	static int r, c, d;
	static int[][] map;
	static boolean[][] visit;
	static int cnt = 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());
		
		st = new StringTokenizer(br.readLine());
		r = Integer.parseInt(st.nextToken());
		c = Integer.parseInt(st.nextToken());
		d = Integer.parseInt(st.nextToken());
		
		map = new int[N][M];
		visit = new boolean[N][M];
		
		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());
			}
		}
		visit[r][c] = true;
		dfs(r, c, d);
		System.out.println(cnt);
	}

	private static void dfs(int y, int x, int d) {
		int nx = 0;
		int ny = 0;
		boolean check = false;
		for (int i = 0; i < 4; i++) {
			if(d == 0) {
				nx = x - 1;
				ny = y;
				d = 3;
			}else if(d == 1) {
				nx = x;
				ny = y - 1;
				d = 0;
			}else if(d == 2) {
				nx = x + 1;
				ny = y;
				d = 1;
			}else if(d == 3) {
				nx = x;
				ny = y + 1;
				d = 2;
			}
			
			if(nx >= 0 && ny >= 0 && nx < M && ny < N && !visit[ny][nx] && map[ny][nx] == 0) {
				cnt++;
				visit[ny][nx] = true;
				dfs(ny, nx, d);
				check = true;
				break;
			}
		}
		
		if(!check) {
			if(d == 0) {
				nx = x;
				ny = y + 1;
			}else if(d == 1) {
				nx = x - 1;
				ny = y;
			}else if(d == 2) {
				nx = x;
				ny = y - 1;
			}else if(d == 3) {
				nx = x + 1;
				ny = y;
			}
			
			if(map[ny][nx] != 1) {
				dfs(ny, nx, d);
			}
		}
		
		
	}

}

 

Ysik Github : https://github.com/Y1sik/Algorithm/blob/main/BJ/BJ_%EB%A1%9C%EB%B4%87%EC%B2%AD%EC%86%8C%EA%B8%B0.java

반응형

'알고리즘' 카테고리의 다른 글

[Java] 백준 2745번 진법 변환  (0) 2022.04.16
[Java] 백준 1357번 뒤집힌 덧셈  (0) 2022.04.15
[Java] 백준 1966번 프린터 큐  (0) 2022.04.13
[Java] 백준 7567번 그릇  (0) 2022.04.12
[Java] 백준 1439번 뒤집기  (0) 2022.04.11

BELATED ARTICLES

more