Study/Coding Test
[2020 KAKAO] 자물쇠와 열쇠
_gayeon
2021. 10. 5. 18:46
https://programmers.co.kr/learn/courses/30/lessons/60059
코딩테스트 연습 - 자물쇠와 열쇠
[[0, 0, 0], [1, 0, 0], [0, 1, 1]] [[1, 1, 1], [1, 1, 0], [1, 0, 1]] true
programmers.co.kr
SOL)
1. key가 전체 lock에 한칸 겹칠수 있는 크기의 array를 -1로 초기화
2. lock의 홈 개수 파악 및 lock 표시
3. key의 돌기와 lock의 홈이 만나는지 체크
3-1. key의 돌기와 lock의 돌기가 만나는 경우, 해당 위치에서 break;
3-2. lock의 모든 홈에 대해 맞으면 true 반환
3-3. 열쇠를 돌려가며 반복 (4방향)
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int M, N;
int arr[60][60];
void rotate(vector<vector<int>> &key, int M){
vector<vector<int>> temp = key;
for(int i=0; i<M; i++){
for(int j=0; j<M; j++){
key[i][j] = temp[M-1-j][i];
}
}
}
bool solve(vector<vector<int>> &key, int lock_cnt){
for(int i=0; i<M+N-1; i++){
for(int j=0; j<M+N-1; j++){
int cnt = 0;
bool check = true;
for(int k=0; k<M; k++){
if(!check){
break;
}
for(int l=0; l<M; l++){
if(arr[i+k][j+l] == 1 && key[k][l] == 1){
check = false;
}
else if(arr[i+k][j+l] == 0 && key[k][l] == 1){
cnt++;
}
}
}
if(cnt == lock_cnt){
return true;
}
}
}
return false;
}
bool solution(vector<vector<int>> key, vector<vector<int>> lock) {
bool answer = false;
int lock_cnt = 0;
M = key.size(); // key 크기
N = lock.size(); // lock 크기
//arr 초기화
for(int i=0; i<M*2+N-1; i++){
for(int j=0; j<M*2+N-1; j++){
arr[i][j] = -1;
}
}
//lock 개수 파악 및 arr 초기화
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
arr[M-1+i][M-1+j] = lock[i][j];
if(lock[i][j] == 0) lock_cnt++;
}
}
//전체 arr 프린트
// for(int i=0; i<M*2+N-1; i++){
// for(int j=0; j<M*2+N-1; j++){
// cout << arr[i][j] << " ";
// }
// cout << endl;
// }
// cout << endl;
for(int k=0; k<4; k++){
//몇개 맞는지 체크
answer = solve(key, lock_cnt);
if(answer){
return true;
}
//열쇠 회전
rotate(key, M);
}
return answer;
}