[프로그래머스✈][2020 kakao] 동굴 탐험


👓 문제 요약

우리 프로도는 특정한 규칙을 세워서 동굴의 각 방들을 탐험 하려고 한다. 해당 규칙을 만족하게 계획을 세우고 모든 방을 탐험할 수 있는지 탐색하라!

자세한 문제 설명과 제한 사항은 프로그래머스 홈페이지 참고. 문제풀러가기

🔑 문제 풀이

루트부터 각각의 방들을 탐색하며, 선행이 필요한 방은 이후에 다시 조사한다!

선행이 되는 방을 방문한다면, 선행이 필요한 방은 방문 가능하다고 판단한다.

🥽 소스코드 및 소스해석

프로그래머스 사이트가 아닌, visual studio 에서 코드를 작성해서 그대로 가져온 것 입니다. 일부 테스트 코드가 존재합니다.

#include <string>
#include <vector>
#include <deque>
#include <string.h>
using namespace std;

int pre[200000];
int post[200000];
int hang[200000];
vector<vector<int>> myTree;
bool visit[200000];

bool solution(int n, vector<vector<int>> path, vector<vector<int>> order);

int main() {
    vector<vector<int>> path = { {0,1} ,{0,3},{0,7},{8,1},{3,6},{1,2},{4,7},{7,5} };
    vector<vector<int>> order = { {8, 5}, {6, 7}, {4, 1} };
    vector<vector<int>> path2 = { {8,1},{0,1},{1,2},{0,7},{4,7},{0,3},{7,5},{3,6}  };
    vector<vector<int>> order2 = { {4, 1}, {5, 2} };
    vector<vector<int>> path3 = { {0, 1}, {0, 3}, {0, 7}, {8, 1}, {3, 6}, {1, 2}, {4, 7}, {7, 5} };
    vector<vector<int>> order3 = { {4, 1}, {8, 7}, {6, 5} };
    bool answer = solution(9, path, order);
}

bool solution(int n, vector<vector<int>> path, vector<vector<int>> order) {
    myTree.assign(200000, vector<int>(0));
    memset(post, -1,sizeof(post));
    memset(pre, -1, sizeof(pre));
    memset(hang, -1, sizeof(hang));
    for (int i = 0; i < path.size(); i++){
        myTree[path[i][0]].push_back(path[i][1]);
        myTree[path[i][1]].push_back(path[i][0]);
    }
    for (int i = 0; i < order.size(); i++){
        if (order[i][1] == 0) return false;
        pre[order[i][0]] = order[i][1];
        post[order[i][1]] = order[i][0];
    }

    deque<int> myStack;
    myStack.push_back(0);
    visit[0] = true;
    while (!myStack.empty()) {
        int node = myStack.back();
        myStack.pop_back();
        for (int i = 0; i < myTree[node].size(); i++)
        {
            int target = myTree[node][i];
            if (visit[target] == true) continue;
            if (pre[target] != -1) {
                if (hang[pre[target]] != -1) {
                    myStack.push_back(pre[target]);
                }
                myStack.push_back(target);
            }
            else if (post[target] != -1) {
                if (visit[post[target]]) {
                    myStack.push_back(target);
                }
                else
                    hang[target] = post[target];
            }
            else {
                myStack.push_back(target);
            }
            visit[target] = true;
        }
    }
    for (size_t i = 0; i < n; i++) {
        if (visit[i] != true) return false;
    }
    return true;
}

🔨 문제 후기

매우 힘든 문제였다. 처음 풀었다가 효율성 마지막 번호만 통과하지 못하는 최악의 상황을 통과하지 못했다.

단순하게 스택-큐 같이 넣어 버린다면 효율성 마지막 케이스에서 시간초과가 뜰 것이다.

또한 이 미친 제출자는 0번 방을 들리기 전에 필요한 선행조건을 테스트 케이스로 만들어놨으니 주의.

걍풀지마세요. 답보고 푸세요.😁😁😁🤣🤣🤣

Series

Algorithms

이 글은 "Algorithms" 시리즈의 11번째 기록입니다.

11 / 27
  1. 01#[프로그래머스][연습문제] 3 x N 타일링 풀이
  2. 02[프로그래머스][2019 kakao] 블록게임 해설
  3. 03[프로그래머스][2019 kakao] 길 찾기 게임 문제 해설
  4. 04[프로그래머스][2019 kakao] 무지의 먹방 라이브 문제 해설
  5. 05[프로그래머스][2019 kakao] 후보키 문제 해설
  6. 06[프로그래머스✈][2020 kakao] 자물쇠와 열쇠 문제 풀이
  7. 07[프로그래머스][2020 kakao] 기둥과 보 설치 문제 해설
  8. 08[프로그래머스✈][2020 kakao] 가사 검색 문제 풀이
  9. 09[백준🔉][16234] 인구이동 문제 해설
  10. 10[프로그래머스✈][2019 kakao 겨울 인턴십] 불량 사용자 문제 해설
  11. 11[프로그래머스✈][2020 kakao] 동굴 탐험
  12. 12[백준🔉][14501] 퇴사 문제 해설
  13. 13[프로그래머스✈][2017 카카오코드] 4단 고음 해설
  14. 14[프로그래머스✈][2019 kakao 겨울 인턴쉽] 징검다리 건너기 해설
  15. 15[프로그래머스✈][연습문제] 섬 연결하기 풀이
  16. 16[leetcode][15] 3sum 문제풀기!
  17. 17[leetcode][16] 3sum closet 문제풀기!
  18. 18[📣top interview question] Remove Duplicates from Sorted Array Solution 문제풀기!
  19. 19[📣top interview question] Best Time to Buy and Sell Stock II 문제풀기!
  20. 20[leetcode][30] Substring with Concatenation of All Words 문제풀기!
  21. 21[leetcode][31] Next Permutation 문제풀기!
  22. 22[leetcode][32] Longest Valid Parentheses 문제풀기
  23. 23[leetcode][40] Combination Sum II 문제풀기!
  24. 24[leetcode][42] Trapping Rain Water 문제풀기!
  25. 25[leetcode][43] Multiply Strings 문제풀기!
  26. 26[leetcode][44] Wildcard Matching 문제풀기!
  27. 27[leetcode][45] Jump Game II 문제풀기!
시리즈 전체 보기