old/Algorithm

5주차 카카오문제(자물쇠와 열쇠)

hYhY1234 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;
}

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

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