Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- C++
- DB
- 응용 계층
- Application Layer
- boot sequence
- 프로그래머스
- dp
- 문제풀이
- Database
- 백준
- leetcode
- 다익스트라
- 임베디드
- Embedded
- Djikstra
- STL
- BHS
- 전송 계층
- 데이터베이스
- 릿코드
- Transport layer
- 관계형 모델
- 자료구조
- ps
- 부트시퀀스
- baekjoon
- BST
- Network
- swea
- 네트워크
Archives
- Today
- Total
BOBO's Note
[ Baekjoon ] 1103. 게임 본문
1103번: 게임
줄에 보드의 세로 크기 N과 가로 크기 M이 주어진다. 이 값은 모두 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 보드의 상태가 주어진다. 쓰여 있는 숫자는 1부터 9까지의 자연수 또는
www.acmicpc.net
풀이 방법
임의의 칸에서 움직일 수 있는 모든 칸에 대해서 DFS 방식으로 확인해보면 된다. 이때, 시간 초과가 발생할 수 있으므로 DP를 이용한다. memo[i][j]에 board[i][j]에서 시작할 때 최대 움직일 수 있는 횟수를 저장하면, 똑같은 위치를 재방문할 때 곧바로 결과값을 알아낼 수 있다.
우선 dfs() 함수에서는 현재 위치 cur에서 시작할 때, 최대 움직일 수 있는 횟수를 반환한다고 하자. 만약 현재 위치가 보드의 바깥이거나 구멍이라면 더이상 움직일 수 없으므로 0을 반환한다.
if (!valid(cur)) return 0;
if (board[cur.r][cur.c] == 'H') return 0;
그리고 아직 방문한 적이 없다면 다음 위치 next를 계산한다. 만약 next가 이미 방문한 적 있는 위치라면 cycle이 생겼다는 의미이다. 따라서 이 경우에는 -1을 출력하고 프로그램을 종료한다. 그렇지 않다면 memo 원소를 업데이트한다.
const static int dr[4] = { -1, 1, 0, 0 };
const static int dc[4] = { 0, 0, -1, 1 };
if (memo[cur.r][cur.c] <= 0) {
visit[cur.r][cur.c] = true;
for (int i = 0; i < 4; i++) {
int next_r = cur.r + (board[cur.r][cur.c] - '0') * dr[i];
int next_c = cur.c + (board[cur.r][cur.c] - '0') * dc[i];
Pos next = Pos(next_r, next_c);
if (valid(next) && visit[next_r][next_c]) {
printf("-1");
exit(0);
}
memo[cur.r][cur.c] = max(memo[cur.r][cur.c], dfs(next) + 1);
}
visit[cur.r][cur.c] = false;
}
전체 코드는 여기서 확인할 수 있다.
'Algorithm > Problem Solving' 카테고리의 다른 글
[ 프로그래머스 ] 라면공장 (0) | 2020.07.27 |
---|---|
[ 프로그래머스 ] 가장 먼 노드 (0) | 2020.07.09 |
[ LeetCode ] 53. Maximum Subarray (0) | 2020.07.04 |
[ 프로그래머스 ] 큰 수 만들기 (0) | 2020.06.30 |
[ LeetCode ] 98. Validate Binary Search Tree (0) | 2020.06.28 |
Comments