문제
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어
www.acmicpc.net
구현 방법
시뮬레이션 문제이므로 문제에 제시된 조건 그대로.. 동작하게 해주었습니다.
방향이 지정되어 있으므로 델타 값은 (상 우 하 좌) 순서대로 설정해주었습니다.
네 방향이 모두 청소가 되었는지 확인하기 위해서 방향을 몇 개 확인했는지 체크해주는 카운트 변수를 사용해주었고
카운트가 4가 되면 모두 청소가 된 것이므로 후진을 해주었습니다.
하지만.. 예제부터 틀렸습니다. 예제가 계속 20으로 나왔고 대체 뭐가 문제일까 고민하고 직접 그려도 본 결과 후진을 못해서 그런것임을 깨달았고 해결했습니다.
저는 청소를 했을 때 방문체크 표시로 벽과 같이 1로 바꿔주었습니다. 후진은 청소를 이미 한 곳이여도 가능했으므로 벽과 같은 표시를 한 청소가 된 공간이 있음에도 불구하고 후진을 못해주어서 틀렸습니다. 청소한 공간은 2로 표시해주어 해결했습니다.
구현 코드
package BOJ.Gold;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class B14503_로봇청소기 {
static int R, C, r, c, dir, cnt, dirCnt;
static int[][] map, deltas = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; // 북 동 남 서
static boolean flagEnd;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
map = new int[R][C];
st = new StringTokenizer(br.readLine());
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
dir = Integer.parseInt(st.nextToken());
for (int i=0;i<R;i++) {
st = new StringTokenizer(br.readLine());
for (int j=0;j<C;j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
// 입력완료
cnt = 1;
while(true) {
if(map[r][c]!=1) map[r][c] = 2;
clean((dir+3)%4);
if (flagEnd) break;
}
System.out.println(cnt);
}
static void clean(int d) {
int nr = r+deltas[d][0];
int nc = c+deltas[d][1];
if (isIn(nr, nc) && map[nr][nc]==0) {
dir = d;
r = nr; c = nc;
cnt++;
dirCnt = 0;
} else if (isIn(nr, nc) && map[nr][nc]!=0) {
dir = d;
dirCnt++;
}
if (dirCnt==4) {
dirCnt = 0;
nr = r-deltas[dir][0];
nc = c-deltas[dir][1];
if (isIn(nr, nc) && (map[nr][nc]==0||map[nr][nc]==2)) {
r = nr; c = nc;
} else {
flagEnd = true;
}
}
}
static boolean isIn(int nr, int nc) {
return nr>=0 && nr<R && nc>=0 && nc<C;
}
}
'백준' 카테고리의 다른 글
백준 1475번 : 방 번호 (0) | 2021.03.06 |
---|---|
백준 1292번 : 쉽게 푸는 문제 (0) | 2021.03.06 |
백준 4948번 : 베르트랑 공준 (0) | 2021.03.06 |
백준 16948번 : 데스 나이트 (0) | 2021.03.06 |
백준 14716번 : 현수막 (0) | 2021.03.06 |