책보고 정석으로 공부하면서 스스로 풀게된 첫번째 동적계획법 유형의 문제이다.
Solution(y, x)는 입력이 같을 경우 항상 같은 값을 반환하는 참조적 투명 함수이기 때문에, 메모이제이션 기법을 적용할 수 있다.
최대 크기가 100X100인 2차원 배열 memo[100][100] 를 선언하고 -1로 초기화하여, memo[y][x]가 -1이라면 처음 방문하는 지점이므로 성공 여부를 탐색하고, 성공 여부를 저장한다. -1이 아니라면 이미 탐색했던 지점이므로 memo[y][x]값을 바로 리턴해준다.
기저사례로 배열의 범위를 벗어날 경우 false, 현재 좌표가 (N-1, N-1) 이라면 끝에 도달한 것이므로 true를 반환해주도록 구현하였다.
#include <iostream> #include <cstring> using namespace std; int N, board[100][100], memo[100][100]; bool Solution(int startY,int startX) { if (startY >= N || startX >= N) return false; // 기저사례. 범위 벗어나면 false if (startY == N - 1 && startX == N - 1) return true; // 기저사례. 끝에 도달했다면 true int& ret = memo[startY][startX]; if (ret != -1) return ret; // 메모이제이션. 이미 해당 좌표에 대해 경로탐색을 해봤다면 저장한 성공여부 반환 return ret = Solution(startY + board[startY][startX], startX) || Solution(startY, startX + board[startY][startX]); } int main(void) { int testcase; cin >> testcase; while (testcase--) { cin >> N; memset(memo, -1, sizeof(board)); for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) cin >> board[i][j]; if (Solution(0, 0)) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }
알고리즘 200일 프로젝트 - 48 day
'알고리즘 > algospot' 카테고리의 다른 글
알고리즘 문제해결전략 예제:삼각형 위 최대경로 (ID: TRIANGLEPATH) (0) | 2020.05.26 |
---|---|
알고리즘 문제해결전략 문제8.2 와일드카드 (ID: WILDCARD) (0) | 2020.05.25 |
알고리즘 문제해결전략 문제7.4 울타리 잘라내기 (ID: FENCE) (0) | 2020.05.09 |
알고리즘 문제해결전략 문제7.2 쿼드 트리 뒤집기 (ID: QUADTREE) (0) | 2020.05.09 |
알고리즘 문제해결전략 문제6.8 시계 맞추기(ID: CLOCKSYNC) (0) | 2020.04.10 |