안녕하세요. 이번 포스팅에서는 Programmers 문제인 자물쇠와 열쇠 문제를 풀어보겠습니다.
해당 문제는 아래의 링크에서 확인하실 수 있습니다.
https://programmers.co.kr/learn/courses/30/lessons/60059
단순한 완전 탐색 문제입니다.
Key를 90도로 네 번 회전하는 경우의 수 ->
각 Key마다 Key의 오른쪽 아래의 끝점이 lock배열의 왼쪽 맨 위에 접하는 부분부터
각 Key의 왼쪽 위 끝점이 lock 배열의 오른쪽 맨 아래에 접하는 부분까지 모든 경우를 탐색해주시면 됩니다.
주의하실 점이
자물쇠 영역을 벗어난 부분에 있는 열쇠의 홈과 돌기는 자물쇠를 여는 데 영향을 주지 않지만, 자물쇠 영역 내에서는 열쇠의 돌기 부분과 자물쇠의 홈 부분이 정확히 일치해야 하며 열쇠의 돌기와 자물쇠의 돌기가 만나서는 안됩니다. 또한 자물쇠의 모든 홈을 채워 비어있는 곳이 없어야 자물쇠를 열 수 있습니다.
라는 문구인데, 쉽게 생각하면, Key가 1이고 Lock이 1이면 안됩니다. 해당 경우의수가 포함된 case는 정답이 될 수 없습니다.
<소스 코드>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<vector<int>> rotate90(vector<vector<int>>& key) {
int m = key.size();
vector<vector<int>> ret(m, vector<int>(m));
for(int i = 0; i < key.size(); i++) {
for(int j = 0; j < key[i].size(); j++) {
ret[i][j] = key[j][m-i-1];
}
}
return ret;
}
bool unlock(int y, int x, vector<vector<int>>& key, vector<vector<int>> lock) {
int keySize = key.size(), lockSize = lock.size();
for(int i = 0; i < keySize; i++) {
for(int j = 0; j < keySize; j++) {
if(key[i][j]==1 && i+y < lockSize && j+x < lockSize
&& i+y >= 0 && j+x >= 0 ){
if(lock[i+y][j+x]==0) lock[i+y][j+x]=1;
else return false; // 이 부분 유의!
}
}
}
for(int i = 0; i < lockSize; i++) {
for(int j = 0; j < lockSize; j++) {
if(lock[i][j]==0) return false;
}
}
return true;
}
bool solution(vector<vector<int>> key, vector<vector<int>> lock) {
int n = lock.size(), m=key.size();
for(int i = 0; i < 4; i++) {
key = rotate90(key);
for(int j = -m+1; j < n; j++) {
for(int k = -m+1; k < n; k++) {
if(unlock(j, k, key, lock)) {
return true;
}
}
}
}
return false;
}
*저의 글에 대한 피드백이나 지적은 언제나 환영합니다.
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] 위클리 챌린지 5주차 - 모음 사전 (0) | 2021.08.30 |
---|---|
[Programmers] 위클리 챌린지 4 직업군 추천하기 (0) | 2021.08.24 |
[Programmers] 위클리 챌린지 3주차 - 퍼즐 조각 채우기 (0) | 2021.08.22 |
[Programmers 문제 풀이] 기지국 설치 (0) | 2021.08.09 |
[Programmers 문제 풀이] 외벽 점검 (0) | 2021.08.08 |