ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 5주차 카카오문제(자물쇠와 열쇠)
    old/Algorithm 2020. 7. 12. 20:10
    728x90
    #include <string>
    #include <vector>
    #include <iostream>
    using namespace std;
    
    bool solution(vector<vector<int>> key, vector<vector<int>> lock) {
        bool answer = true;
        int key_M = key.size();
        int lock_N = lock.size();
        int zero_count = 0;
        // 홈 갯수 카운트 + map 확장
        vector<vector<int>> widen(lock_N + (key_M-1) * 2, vector<int> (lock_N + (key_M-1) * 2, 1)); // 모두 1로 초기화
    
        for(int i = 0; i < lock_N; i++){
            for(int j = 0; j < lock_N; j++){
                if(lock[i][j] == 0){
                    zero_count++;
                }
                widen[key_M-1 + i][key_M-1 + j] = lock[i][j];    
            }
        }
        
        vector<vector<vector<int>>> key_list;
        key_list.push_back(key);
        for(int rotation = 0; rotation < 3; rotation++){
            vector<vector<int>> temp(key_M, vector<int> (key_M));
            for(int a = 0; a < key_M; a++){
                for(int b = 0; b < key_M; b++){
                    temp[b][key_M-a-1] = key_list[key_list.size() - 1][a][b];
                }
            }
            key_list.push_back(temp);
        }
        
        for(int type = 0; type < 4; type++){
            for(int i = 0; i < widen.size() - (key_M-1); i++){
                for(int j = 0; j < widen.size() - (key_M-1); j++){
                    int cur_zeros = 0;
                    for(int k = 0; k < key_M; k++){
                        for(int l = 0; l < key_M; l++){
                            if(key_list[type][k][l] == 1 && widen[i + k][j + l] == 0){
                                cur_zeros++;
                            }
                            if(key_list[type][k][l] == 1 && widen[i + k][j + l] == 1 && !(i + k < key_M  || j + l < key_M  || i + k > (widen.size() - key_M) ||  j + l> (widen.size() - key_M))){
                                cur_zeros = 0;
                                continue;
                            }
                        }
                    }
                    if(cur_zeros == zero_count){
                        return true;
                    }
                }
            }
        }
        
    
        
        // for(int i = 0; i < widen.size(); i++){
        //     for(int j = 0; j < widen.size(); j++){
        //         cout << widen[i][j] << " ";
        //     }
        //     cout << "\n";
        // }
        
        
        return false;
    }

    이것도 규칙대로만 하면되는데 코드가 좀 지저분한 감이 없지 않아있다. 

    그래도 코테 연습을 계속했더니, 지저분한 코드도 나름 감당이 된다~!

    댓글

Designed by Tistory.