| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
Tags
- 월간 코드 챌린지 시즌1
- 정수 삼각형
- 백준
- Java
- 1932
- 정렬
- 깃허브 프로필
- 다익스트라
- 프로그래멋
- 자바
- BFS
- GIT
- 토마토
- 깃허브
- 분할정복
- 이코테
- Lv2
- Python
- 15686
- 그래프
- 알고리즘
- 완전탐색
- dfs
- 프로그래머스
- 구현
- 조합
- 그래프탐색
- 알고리즘고득점Kit
- DP
- Summer/Winter Coding(~2018)
Archives
- Today
- Total
갱스터하우스
[Java] 백준 14503.로봇 청소기 본문
➡️문제 링크
https://www.acmicpc.net/problem/14503
💡아이디어
구현
문제에 나온 조건을 그대로 구현했다.
✏️문제 풀이
1. 구현 - 성공
반시계 방향으로 회전할 때가 가장 어려웠다.
처음에는 for문을 돌릴 때, 증가되는 i값을 가지고 회전해야하나 싶었는데,
몇 번 틀리니 이렇게 푸는게 아니라는 생각이 들었다.
i는 거들뿐, 회전은 기존의 dir만을 가지고 계속 해야했다.
" 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우 " 이 조건을 어떻게 해야하나 싶어 처음에는 boolean 변수를 만들어 4칸 다 빈 칸이 없는 경우를 체크하려고 했는데, 그냥 1칸이라도 아직 청소되지 않았다면 dfs()를 통해 청소하고 바로 return 해버리면 됐다.
import java.io.*;
import java.util.*;
/*
* 1. 현재 칸 청소
* 2. 현재 칸 주변 4칸에 청소해야하는 칸 존재X
* -> (1) 현재 방향 유지한채로 한칸 후진 가능 -> 한칸 후진 + 1번
* (2) 바라보는 방향 뒤쪽 칸이 벽이라 후진 불가능 -> 작동 멈춤
* 3. 현재 4칸 중 청소되지 않은 빈 칸 존재.
* (1) 반시계 방향 90도 회전
* (2) 바라보는 방향 기준 앞쪽 칸이 청소되지 않은 빈칸 인 경우 한 칸 전지
* (3) 1번으로 돌아가기
* */
public class Main {
static int N, M;
static int [][] map;
static boolean [][] visited;
static int [] dx = {-1, 0, 1, 0};
static int [] dy = {0, 1, 0, -1};
static int count = 0;
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
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];
visited = new boolean[N][M];
int sx = 0;
int sy = 0;
int sd = 0;
st = new StringTokenizer(br.readLine());
sx = Integer.parseInt(st.nextToken());
sy = Integer.parseInt(st.nextToken());
sd = 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());
}
}
dfs(sx, sy, sd);
// 정답 출력
System.out.println(count);
}
static void dfs(int x, int y, int dir) {
// 1. 현재 칸 청소
if(map[x][y] == 0) { // 아직 청소 전
map[x][y] = 2; // 청소 완료
count++;
}
// 2. 주변 4칸 확인
for(int i = 0; i < 4; i++) {
dir = (dir+3) % 4;
// int newDir = (4-(dir-1))%4;
int tx = x + dx[dir];
int ty = y + dy[dir];
if(checkRange(tx, ty)) {
if(map[tx][ty] == 0) {
dfs(tx, ty, dir); // 방향전환 가능한 칸 발견
return;
}
}
}
// 3. 주변 4칸 중 청소되지 않은 빈칸 존재X
int bx = x;
int by = y;
if(dir == 0) bx++;
else if(dir == 1) by--;
else if(dir == 2) bx--;
else by++;
if(!checkRange(bx, by)) return; // 후진 불가
if(map[bx][by] == 1) return;
dfs(bx, by, dir);
}
static boolean checkRange(int x, int y) {
return x >= 0 && x < N && y >= 0 && y < M;
}
}
'코테 문제 > 백준' 카테고리의 다른 글
| [Java] 백준 14938.서강그라운드 (0) | 2026.04.01 |
|---|---|
| [Java] 백준 14502.연구소 (0) | 2026.03.27 |
| [Java] 백준 1753.최단 경로 (0) | 2026.03.17 |
| [Java] 백준 15686.치킨 배달 (0) | 2026.03.13 |
| [Java] 백준 13549.숨바꼭질 3 (0) | 2026.03.12 |