티스토리 뷰

반응형

https://programmers.co.kr/learn/courses/30/lessons/67260

 

코딩테스트 연습 - 동굴 탐험

9 [[0,1],[0,3],[0,7],[8,1],[3,6],[1,2],[4,7],[7,5]] [[8,5],[6,7],[4,1]] true 9 [[8,1],[0,1],[1,2],[0,7],[4,7],[0,3],[7,5],[3,6]] [[4,1],[5,2]] true 9 [[0,1],[0,3],[0,7],[8,1],[3,6],[1,2],[4,7],[7,5]] [[4,1],[8,7],[6,5]] false

programmers.co.kr

 

주의점

1. 문제에서 0번부터 시작한다고 알려준다. 루트를 찾을 필요가 없다.

2. 문제에는 안나와 있지만 order에 [1,0] 처럼 0번 노드의 선행조건이 있는 테스트 케이스가 있다고 한다. (59번 라인 예외처리)

 

풀이

1. 선행 됐어야 하는 노드가 있었나? -> 대기열(set)에 넣는다.

2. 해당 노드가 선행 됐어야 했던 노드였나? (큐에 해당 노드의 후행 노드가 있는가?) 

    -> 대기열(set)에서 빼서 진행열(queue)에 넣고 방문표시를 한다.

3. 위 2개에 해당사항이 없는 노드인가? -> 진행열(queue)에 넣으면서 해당 노드는 방문표시를 한다.

 

이렇게 하면 모든 정점을 방문한경우 visited 배열이 전부 true 로 되고

방문하지 못하는 경우는 대기열에 넣은 노드의 선행노드를 방문할 수 있는 경우가 전혀 없었다는 (문제의 3번예제) 것이기때문에 큐에 후행노드가 넣어지지 못해 while문이 종료되고 visited 배열이 전부 true가 되지 못한다.

(와 나 설명진짜 못하는것 같다... ㅠㅠ)

#include <string>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <queue>
using namespace std;
int N;
bool answer;
vector<int> tree[200001];
int visited[200001];
unordered_set<int> s;
int before[200001];
int after[200001];


// 선행조건이 있는 노드면 q에넣고 대기
// q에 있었던 노드면 빼서 방문하고 q에 넣는다 -> 이제 방문가능함. 계속 방문못하면 가는길 없는 거임

void bfs(int cur) {
    queue<int> q;
    q.push(cur);
    visited[cur]=1;
    while(!q.empty()){
        int cur = q.front();
        q.pop();
        before[after[cur]]=0; // 기본 루틴의 경우 추가해준 후행의 선행은 0으로 원복
        if(s.find(after[cur])!=s.end()){
            s.erase(after[cur]);
            visited[after[cur]]=1;
            q.push(after[cur]);
        }
        for (int i=0; i<tree[cur].size(); i++){
            int next = tree[cur][i];
            if(visited[next]) continue;

              // 선행조건이 있는 노드인가
            if(before[next]!=0){
                s.insert(next);
                continue;
            }
            // 선행조건이 없는 노드 였다.
            visited[next]=1;
            q.push(next);
        }
    }
}
bool solution(int n, vector<vector<int>> path, vector<vector<int>> order) {
    answer = true;
    N=n;
    
    for (int i=0; i<path.size(); i++) {
        tree[path[i][0]].push_back(path[i][1]);
        tree[path[i][1]].push_back(path[i][0]);
    }
    for (int i=0; i<order.size(); i++) {
        after[order[i][0]] = order[i][1];
        before[order[i][1]] = order[i][0];
    }
    if(before[0]!=0) return false;
    bfs(0);
    for (int i=0; i<n; i++){
        if(visited[i]==0) answer = false;
    }
    return answer;
}
반응형

'알고리즘' 카테고리의 다른 글

[프로그래머스] 빛의경로 사이클  (2) 2022.05.06
[백준] 1175 배달  (0) 2022.04.27
[프로그래머스] 경주로건설  (0) 2022.04.23
[프로그래머스] 추석트래픽  (1) 2022.04.08
k진수에서 소수 개수 구하기  (0) 2022.03.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/04   »
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
글 보관함