Make Unreal REAL.
article thumbnail
Level 3. 등굣길

 

 

BFS가 가물가물해서 BFS로 풀어봤더니 시간 초과가 발생했다.

 

최단 거리순으로 확인하기 때문에, 최초 최단거리를 넘어서는 순간부터는 확인하지 않아도 된다.

 

// 이 풀이는 시간 초과가 발생한다.
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

struct point
{
    int dist;
    int x;
    int y;
};

int solution(int m, int n, vector<vector<int>> puddles)
{
    int answer = 0;
    int minDist = 0;
    int dx[] = {1, 0}, dy[] = {0, 1};
    
    queue<point> que;
    vector<vector<bool>> map(n, vector<bool>(m, true));

    for (vector<int>& puddle : puddles)
        map[puddle[1] - 1][puddle[0] - 1] = false;

    --m, --n;
    que.emplace(point{0, 0, 0});

    while (!que.empty())
    {
        point p = que.front();
        que.pop();

        if (0 < minDist && minDist < p.dist)
            break;

        if (p.x == m && p.y == n && minDist == 0)
            minDist = p.dist;

        if (p.x == m && p.y == n && p.dist == minDist)
            answer = (answer + 1) % 1'000'000'007;

        for (int i = 0; i < 2; ++i)
        {
            int x = p.x + dx[i];
            int y = p.y + dy[i];

            if (x <= m && y <= n && map[y][x])
                que.emplace(point{p.dist + 1, x, y});
        }
    }

    return answer;
}

 

출제 의도대로 DP로 풀었다.

 

옆이나 위로부터 값을 채워가는 형태에서는 추가 패딩을 집어넣는 것이 편하다.

 

#include <iostream>
#include <vector>

#define PUDDLE -1

using namespace std;

int solution(int m, int n, vector<vector<int>> puddles)
{
    vector<vector<int>> map(n + 1, vector<int>(m + 1, 0));

    for (vector<int>& puddle : puddles)
        map[puddle[1]][puddle[0]] = PUDDLE;

    map[0][1] = 1;

    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            if (map[i][j] != PUDDLE)
                map[i][j] = ((map[i - 1][j] != PUDDLE ? map[i - 1][j] : 0) + (map[i][j - 1] != PUDDLE ? map[i][j - 1] : 0)) % 1'000'000'007;

    return map[n][m];
}

 

좀 더 깔끔한 풀이다.

 

#include <iostream>
#include <vector>

#define PUDDLE -1

using namespace std;

int solution(int m, int n, vector<vector<int>> puddles)
{
    vector<vector<int>> map(n + 1, vector<int>(m + 1, 0));

    for (vector<int>& puddle : puddles)
        map[puddle[1]][puddle[0]] = PUDDLE;

    map[0][1] = 1;

    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            if (map[i][j] == PUDDLE)
                map[i][j] = 0;
            else
                map[i][j] = (map[i - 1][j] + map[i][j - 1]) % 1'000'000'007;

    return map[n][m];
}

'자료구조 & 알고리즘 > 프로그래머스' 카테고리의 다른 글

Level 2. 수식 최대화  (0) 2023.07.20
Level 2. 테이블 해시 함수  (0) 2023.07.19
Level 3. 최고의 집합  (0) 2023.07.17
Level 3. 네트워크  (0) 2023.07.16
Level 3. 단어 변환  (0) 2023.07.15
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그