알고리즘/프로그래머스
프로그래머스 - 자물쇠와 열쇠
시나모온
2020. 8. 31. 06:57
문제 링크입니다 : 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
구현 문제였다.
근데 생각보다 까다롭다. 코딩 테스트 볼 때 이걸 풀어야 된다고 생각하면 아찔하다.
실수를 만들 만한 요소가 굉장히 많다.
우선 key를 90도씩 돌리면서 lock이랑 맞춰봐야 하므로 90도 돌리는 기능을 transpose로 만들었다.
만약에 key가 3 x 3 이고 lock이 6 x 6이라면 아래와 같은 그림이 된다.
그리고 위의 그림처럼 한 칸씩 옮기면서 key를 lock이랑 대놓고 lock 부분의 모든 사각형이 채워졌는지 확인 하면 된다.
그리고 key의 위치는 (-m + 1, - m + 1)에서부터 (n - 1, n - 1)까지가 된다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<vector<int>>& transpose(vector<vector<int>>& key) {
vector<vector<int>> temp(key.size(), vector<int>(key[0].size()));
for(int i = 0; i < key.size(); i++) {
for(int j = 0; j < key[0].size(); j++) {
temp[key[0].size() - 1 - j][i] = key[i][j];
}
}
key = temp;
return key;
}
bool canUnlock(const vector<vector<int>>& key, const vector<vector<int>>& lock, int a, int b) {
for(int i = 0; i < lock.size(); i++) {
for(int j = 0; j < lock[0].size(); j++) {
int y = i - a;
int x = j - b;
if(y >= 0 && y < key.size() && x >= 0 && x < key[0].size()) {
if((key[y][x] && lock[i][j]) || (!key[y][x] && !lock[i][j])) {
return false;
}
} else {
if(!lock[i][j]) return false;
}
}
}
return true;
}
bool solution(vector<vector<int>> key, vector<vector<int>> lock) {
bool answer = false;
int m = key.size();
int n = lock.size();
for(int angle = 0; angle < 4; angle++) {
for(int i = - m + 1; i < n; i++) {
for(int j = - m + 1; j < n; j++) {
if(canUnlock(key, lock, i, j)) {
answer = true;
break;
}
}
if(answer) break;
}
if(answer) break;
transpose(key);
}
return answer;
}
개발 환경 : vscode
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~