다희의 코딩 성장일기

[백준] 14503. 로봇 청소기 (자바 JAVA) 본문

Algorithm/백준 BOJ

[백준] 14503. 로봇 청소기 (자바 JAVA)

ilmiodiario 2021. 8. 16. 15:19

[ 문제 ]  BOJ 14503. 로봇 청소기

 

문제 링크 :  

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

 

14503번: 로봇 청소기

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

www.acmicpc.net


[ 풀이 ]

 

< 접근 방법 및 풀이 >

 

  • 위에 적힌 로봇청소기 동작 방법대로 그대로 구현하면 된다.

< 주의할 점 >

  • 맵 탐색할때 항상 범위밖 생각해서 코드 짰는데 굳이 그럴 필요없음. 이건 테두리가 1로 둘러쌓여있기 때문이다.

JAVA 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	static int dr[] = {-1, 0, 1, 0};
	static int dc[] = {0, 1, 0, -1};
	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine());
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		int map[][] = new int [N][M];
		boolean check[][] = new boolean[N][M];
		st = new StringTokenizer(in.readLine());
		int R = Integer.parseInt(st.nextToken());
		int C = Integer.parseInt(st.nextToken());
		int d = Integer.parseInt(st.nextToken());
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(in.readLine());
			for (int j = 0; j < M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		int cnt = 0;
		boolean flag = true;
		out: while(true) {
			if(flag) {
				check[R][C] = true;
				cnt++;
			}
			flag = true;
			for (int i = 0; i < 4; i++) {
				d = (d-1 < 0)? 3 : d-1;
				int nr = R + dr[d];
				int nc = C + dc[d];
				if(check[nr][nc] || map[nr][nc] == 1)
					continue;
				R = nr;
				C = nc;
				continue out;
			}
			int nr = R-dr[d];
			int nc = C-dc[d];
			if(map[nr][nc] == 1)
				break;
			R = nr;
			C = nc;
			flag = false;
		}
		System.out.println(cnt);
	}
}

 

 


 

REVIEW

사실 5달 전에 풀었던 코드인데도 생각보다 시간이 오래걸렸다.

더 빨리 푸는 연습을 해야겠다.

Comments