문제 - 링크
문제 풀이
- (0,0) -> (N-1,M-1)로 이동할 때 최소의 노력으로 이동하기
- 여기서 최소의 노력이란, 경로상 연속된 칸들의 차이 중 가장 큰 차이 값을 의미
간단한 DFS을 통하여 계산(실패)
- DFS을 돌리며 현재보다 최소의 노력일 때만 진행하도록 수행
int nextHeight = heights[nx][ny];
int diffHeight =Math.abs(nextHeight - currentHeight);
int maxEffort = Math.max(effort, diffHeight);
// 현재보다 노력이 큰 경우 더이상 진행하지 않음
if(maxEffort>=minEffort[nx][ny]) {
continue;
}
dfs(nx, ny, maxEffort, heights);
DFS 코드
void dfs(int x,int y, int effort,int[][] heights){
minEffort[x][y] = Math.min(minEffort[x][y],effort);
if(x == N-1 && y== M-1){
return;
}
int currentHeight = heights[x][y];
for(int i = 0; i<4;i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx<0|| ny<0 || nx>=N|| ny>=M ) {
continue;
}
int nextHeight = heights[nx][ny];
int diffHeight =Math.abs(nextHeight - currentHeight);
int maxEffort = Math.max(effort, diffHeight);
// 현재보다 노력이 큰 경우 더이상 진행하지 않음
if(maxEffort>=minEffort[nx][ny]){
continue;
}
dfs(nx, ny, maxEffort, heights);
}
}
�실패
시간 초과 발생 원인
- 특정 노드의 값에 노력의 값이 내림차순으로 진행되는 경우 불필요한 연산을 계속 수행하는 문제가 있음
- 노력의 값이 최소인 것부터 연산을 수행하자(Dijkstra)