https://www.acmicpc.net/problem/1103
1103번: 게임
줄에 보드의 세로 크기 N과 가로 크기 M이 주어진다. 이 값은 모두 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 보드의 상태가 주어진다. 쓰여 있는 숫자는 1부터 9까지의 자연수 또는
www.acmicpc.net
풀이
문제를 보았을 때 알 수 있는 힌트
문제를 가볍게 생각하고 푼다면 dfs로 풀면 되겠다는 생각을 하게 된다. 하지만 여기서 함정은 다시 돌아 올수있다는 점과 다른곳에서 돌아와 위치를 더 빠르게 오는 경우도 있다. 이를 해결하기 위해서 DP를 활용하면 시간초과를 해결할 수 있다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
// baekjoon 1103 게임
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int[] nx = new int[] { -1, 1, 0, 0 };
static int[] ny = new int[] { 0, 0, -1, 1 };
static int answer = -1;
static int r;
static int c;
static Character[][] graph;
static boolean[][] visited;
static int[][] dp;
static boolean flag;
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
st = new StringTokenizer(br.readLine());
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
// 첫 위치
// 그래프 만들기
graph = new Character[r][c];
visited = new boolean[r][c];
dp = new int[r][c];
// // 첫 위치는 방문 한걸로 처리
visited[0][0] = true;
for (int i = 0; i < r; i++) {
String temp = br.readLine();
for (int j = 0; j < c; j++) {
graph[i][j] = temp.charAt(j);
}
}
dfs(0, 0, 1);
if(flag) System.out.println(-1);
else System.out.println(answer);
}
public static void dfs(int y, int x, int count) {
if (count > answer)
answer = count;
dp[x][y] = count;
int mut = Integer.parseInt(graph[x][y].toString());
for (int k = 0; k < 4; k++) {
int dx = x + nx[k] * mut;
int dy = y + ny[k] * mut;
if (!(0 <= dx && dx < r && 0 <= dy && dy < c && graph[dx][dy] != 'H')) {
continue;
}
if(visited[dx][dy]) {
flag=true;
return;
}
if(dp[dx][dy]>count) continue;
visited[dx][dy] = true;
dfs(dy,dx,count+1);
visited[dx][dy] = false;
}
}
}
https://github.com/dydwkd486/coding_test/blob/main/baekjoon/java/baekjoon1103/Main.java
GitHub - dydwkd486/coding_test: 코딩테스트 공부한 내용 정리
코딩테스트 공부한 내용 정리. Contribute to dydwkd486/coding_test development by creating an account on GitHub.
github.com
'Coding Test > baekjoon' 카테고리의 다른 글
[백준 3055] 게임- 탈출(solved.ac - 골드 4) (0) | 2023.03.21 |
---|---|
[백준 1713] 게임- 후보 추천하기(solved.ac - 실버 1) (0) | 2023.03.20 |
[백준 1059] 좋은 구간- python (solved.ac - 실버 4) (0) | 2022.11.13 |
[백준 15486] 퇴사 2- java (solved.ac - 골드 5) (1) | 2022.09.28 |
[백준 20057] 마법사 상어와 토네이도- java (solved.ac - 골드 3) (1) | 2022.09.26 |