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;
}
이것도 규칙대로만 하면되는데 코드가 좀 지저분한 감이 없지 않아있다.
그래도 코테 연습을 계속했더니, 지저분한 코드도 나름 감당이 된다~!