728x90
문제
https://www.acmicpc.net/problem/14503
어떻게 풀 것인가?
처음에 문제를 이해하는 것이 많이 어려웠다.
주어진 문제에 따르면
- 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
- 현재 칸의 주변 칸 중 청소되지 않은 빈 칸이 없는 경우,
- 바라보는 방향을 유지한 채로 한 칸 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.
- 바라보는 방향의 뒤쪽 칸이 벽이라 후진할 수 없다면 작동을 멈춘다.
- 현재 칸의 주변 칸 중 청소되지 않은 빈 칸이 있는 경우,
- 반시계 방향으로 90∘회전한다.
- 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진한다.
- 1번으로 돌아간다.
주어진 문제의 텍스트는 이렇다.
그래서 처음에는 하나하나 함수로 구현해야하는 것인가? 라는 생각을 했다. 하지만 이는 뭔가 비효율적이다 라는 생각을 하게되었고,
위에서 우선적으로 공통적인 부분을 찾아서, 로직을 구성하여 재귀적인 방법을 통해서 문제를 해결하였다.
다행히 첫 시도만에 성공적으로 문제를 풀 수 있었다.
풀면서 놓쳤던점
구현은 사실 떠올리기가 어려운 것 같다. 구현 문제에 대해서 정말 많은 연습이 필요하다.
이 문제를 통해 얻어갈 것
구현 문제를 푸는 연습을 할 수 있다.
내 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N;
static int M;
static int r;
static int c;
static int d;
static int[][] map;
static int[] dy = {-1, 0, 1, 0}; // 북동남서
static int[] dx = {0, 1, 0, -1};
static int count;
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());
map = new int[N][M];
st = new StringTokenizer(br.readLine());
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
d = Integer.parseInt(st.nextToken());
count = 1;
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());
}
}
clean(r, c, d);
System.out.println(count);
}
public static void clean(int r, int c, int direction) {
map[r][c] = -1;
for (int i = 0; i < 4; i++) {
direction = (direction + 3) % 4;
int nN = r + dy[direction];
int nM = c + dx[direction];
if (nN >= 0 && nN < N && nM >= 0 && nM < M && map[nN][nM] == 0) {
count++;
clean(nN, nM, direction);
return;
}
}
int back = (direction + 2) % 4;
int bN = r + dy[back];
int bM = c + dx[back];
if (bN >= 0 && bN < N && bM >= 0 && bM < M && map[bN][bM] != 1) {
clean(bN, bM, direction);
}
}
}
참고
X
728x90
'BaekJoon' 카테고리의 다른 글
[BaekJoon] 2470번 두 용액 (Java) 문제 풀이 [Gold 5] (0) | 2023.12.31 |
---|---|
[BaekJoon] 2225번 합분해 (Java) 문제 풀이 [Gold 5] (0) | 2023.12.31 |
[BaekJoon] 1759번 암호 만들기 (Java) 문제 풀이 [Gold 5] (0) | 2023.12.28 |
[BaekJoon] 1743번 음식물 피하기 (Java) 문제 풀이 [Sliver 1] (0) | 2023.12.23 |
[BaekJoon] 2583번 영역 구하기 (Java) 문제 풀이 [Sliver 1] (0) | 2023.12.22 |