Skip to content

2024.03.15 - path-with-minimum-effort #37

@wlsgh7608

Description

@wlsgh7608

문제 - 링크

문제 풀이

  • (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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions