문제 : 2020 카카오 BLINE RECRUITMENT 자물쇠와 열쇠
구현
● 열쇠를 돌리고 옮겨가며 자물쇠와 맞는지 안맞는지 체크하면 된다.
● 열쇠는 기존의 상태, 90도 회전 상태, 180도 회전 상태, 270도 회전 상태 총 4가지 모양을 가질 수 있고, 기존의 상태부터 옮겨가며 현재 자물쇠와 맞는지 안맞는지 체크하고, 90도 회전한 후 다시 옮겨가며 현재 자물쇠와 맞는지 안맞는지 체크하고, 90도 더 회전한 후 다시 옮겨가며 체크하는 과정을 반복하면 된다.
● 열쇠를 회전하는 과정은 열쇠 배열을 그대로 복사한 후, 다음과 같은 식으로 회전해서 덮으면 된다.
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
key[i][j] = tempKey[N - 1 - j][i];
● 열쇠를 옮겨가며 자물쇠와 맞는지 안맞는지 체크하는 부분이 문제의 핵심인데, 열쇠랑 자물쇠가 한 칸이라도 겹치는 모든 (i , j) 에서 N x N 크기의 열쇠를 그리고 자물쇠와 겹치는 부분을 체크해주면 된다.
아래 그림과 같이 열쇠를 한 칸씩 이동해가며 모든 경우에 대해 자물쇠와 열쇠의 상태를 확인해주면 됩니다.
● 열쇠가 0인 부분은 자물쇠가 0이던 1이던 상관이 없고, 열쇠가 1일 때 자물쇠가 0이면 우리가 원하는 상황이고, 열쇠가 1일 때 자물쇠가 1이면 문제가 발생하므로 (열쇠, 자물쇠) 가 (1, 0) 이면 자물쇠의 상태를 1로 바꿔주고, (1, 1) 이면 자물쇠의 상태를 0으로 바꿔준다.
#include <string>
#include <vector>
using namespace std;
bool solution(vector<vector<int>> key, vector<vector<int>> lock) {
int rotation = 0, N = key.size(), M = lock.size();
do {
// check
for (int i = -N + 1; i < M; i++) {
for (int j = -N + 1; j < M; j++) {
// (i , j) 에서 N x N key를 그린다고 생각.
vector<vector<int>> tempLock(M);
for (int k = 0; k < M; k++)
for (int l = 0; l < M; l++)
tempLock[k].push_back(lock[k][l]);
for (int k = 0; k < N; k++) {
for (int l = 0; l < N; l++) {
if (0 <= (i + k) && (i + k) < M && 0 <= (j + l) && (j + l) < M) {
if (tempLock[i + k][j + l] == 0 && key[k][l] == 1)
tempLock[i + k][j + l] = 1;
else if (tempLock[i + k][j + l] == 1 && key[k][l] == 1)
tempLock[i + k][j + l] = 0;
}
}
}
// 제대로 만들어졌는지 체크하자.
bool tempCheck = true;
for (int k = 0; k < M; k++)
for (int l = 0; l < M; l++)
if (tempLock[k][l] == 0)
tempCheck = false;
if (tempCheck == true)
return true;
}
}
// 회전
vector<vector<int>> tempKey(N);
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
tempKey[i].push_back(key[i][j]);
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
key[i][j] = tempKey[N - 1 - j][i];
rotation++;
} while (rotation < 4);
return false;
}
'Problem Solving > Programmers' 카테고리의 다른 글
[Programmers] 기둥과 보 설치 (0) | 2020.04.24 |
---|---|
[Programmers] 가사 검색 - travelbeeee (0) | 2020.04.23 |
[Programmers] 괄호 변환 - travelbeeee (0) | 2020.04.15 |
[Programmers] 문자열 압축 - travelbeeee (0) | 2020.04.15 |
[Programmers] [3차] n진수 게임 - travelbeeee (0) | 2020.04.13 |