문제
https://www.acmicpc.net/problem/1405
풀이(25분)
import java.io.*;
import java.util.*;
public class Main {
static int n;
static double answer;
static double[] directionProbability = new double[4];
static int[] dx = {0, 0, 1, -1}; // 동, 서, 남, 북 이동 기준
static int[] dy = {1, -1, 0, 0}; // 동, 서, 남, 북 이동 기준
static boolean[][] visited = new boolean[29][29]; // 방문 체크 배열
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());
int E = Integer.parseInt(st.nextToken());
int W = Integer.parseInt(st.nextToken());
int S = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
// 이동 확률 저장 (백분율 → 소수 변환)
directionProbability[0] = E / 100.0;
directionProbability[1] = W / 100.0;
directionProbability[2] = S / 100.0;
directionProbability[3] = N / 100.0;
// 시작 위치 (14,14) 방문 체크 후 DFS 탐색 시작
visited[14][14] = true;
dfs(14, 14, 0, 1.0); // x, y, 현재 깊이, 현재 확률
// 정답 출력 (소수점 9자리까지)
System.out.printf("%.9f", answer);
}
static void dfs(int x, int y, int depth, double probability) {
// 종료 조건: 최대 이동 횟수 도달
if (depth == n) {
answer += probability;
return;
}
// 4방향 탐색 (동, 서, 남, 북)
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (!visited[nx][ny] && directionProbability[i] > 0) { // 방문하지 않았고 확률이 0이 아닐 때만 이동
visited[nx][ny] = true; // 방문 체크
dfs(nx, ny, depth + 1, probability * directionProbability[i]);
visited[nx][ny] = false; // 백트래킹 (원상 복구)
}
}
}
}
문제 풀이 전략
dfs와 백트래킹을 통해 정답을 추적해 나가는 방식이다.
골드 4 수준의 문제를 접하는 사람에게 어렵지 않은 dfs+백트래킹이라고 생각한다.
다만 중요한 부분은 소수점을 매번 추적해 나가며, 정답을 작성하는 것이다.
또한 문제를 정확히 분석하고, 좌우방향의 제한이 없다는 것과 14번의 이동이 최대라는 점에서 총 29x29의 이차원 배열을 만드는 것이다.
이를 통해 시작점을 가운데 위치시키고, 문제를 해결할 수 있다.
'문제 풀이 > 백준' 카테고리의 다른 글
[백준] 1374번. 강의실 배정(JAVA) (0) | 2025.03.28 |
---|---|
[백준] 1092번. 배(JAVA) (0) | 2025.03.28 |
[백준] 9996번. 한국이 그리울 땐 서버에 접속하지(JAVA) (0) | 2025.03.27 |
[백준] 2195번. 문자열 복사(JAVA) (0) | 2025.03.26 |
[백준] 2229번. 조 짜기(JAVA) (0) | 2025.03.25 |