2020 kakao blind recruitment에서 나왔던 문제로 복잡한 구현문제입니다. (프로그래머스 level3)
문제는 다음과 같습니다.
자물쇠와 열쇠
조건이 참 많은 구현문제입니다.
key의 이동과 회전에 대해서 어떻게 짜야할지 감이 안 잡혀 다음의 티스토리를 참고했습니다.
참고
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<vector<int>> MAP;
int N, M, Size, sum;
void make_MAP(vector<vector<int>> lock)
{
int y = 0, x = 0;
for(int i=M-1; i<Size-M+1; i++, y++)
{
for(int j=M-1; j<Size-M+1; j++, x++)
{
if(lock[y][x]==0) {MAP[i][j] = 0; sum++;}
else MAP[i][j] = 1;
}
x=0;
}
}
int isUnlock(int y, int x, vector<vector<int>> key)
{
int idx_x = 0, idx_y = 0;
int cnt = 0;
for(int i=y; i<y+M; i++, idx_y++)
{
for(int j=x; j<x+M; j++, idx_x++)
{
if(key[idx_y][idx_x]==0 && MAP[i][j]==0) return -1;
if(key[idx_y][idx_x]==1 && MAP[i][j]==1) return -1;
if(key[idx_y][idx_x]==1 && MAP[i][j]==0) cnt++;
}
idx_x=0;
}
return cnt;
}
void rotate_key(vector<vector<int>> &key)
{
vector<vector<int>> tmp = key;
for(int i=0; i<M; i++)
{
for(int j=0; j<M; j++)
{
tmp[i][j] = key[M-1-j][i];
}
}
key = tmp;
}
bool move_key(vector<vector<int>> key)
{
for(int i=0; i<4; i++)
{
//시작칸수
for(int j=0; j<M+N-1; j++)
{
for(int k=0; k<M+N-1; k++)
{
if(isUnlock(j,k,key)==sum)
{
return true;
}
}
}
rotate_key(key);
}
return false;
}
bool solution(vector<vector<int>> key, vector<vector<int>> lock) {
bool answer = true;
M = key.size();
N = lock.size();
Size = N+(M-1)*2;
MAP.resize(Size, vector<int>(Size,2));
make_MAP(lock);
if(!move_key(key)) answer = false;
return answer;
}
[resize 주의할점]
resize하며 더 커지는 경우에만 값이 들어간다.
더 작아지는 경우에는 크기만 작아지고 값이 할당되지는 않는다.
이 코드에서는
MAP.resize(Size, vector<int>(Size,2));
이렇게 사용하였다.
2차원 vector를 size만큼 지정하고 vector (size,2)의 값을 할당한다는 의미
즉 모든 값을 2로 할당
야무지네요... YMG