개발/알고리즘
프로그래머스 자물쇠와 열쇠 C++
daisy-day
2021. 2. 14. 18:02
문제
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
코드
#include <string>
#include <vector>
using namespace std;
int keySize, lockSize, boardSize;
void rotate(vector<vector<int>>& key)
{
vector<vector<int>> temp(keySize, vector<int>(keySize));
for (int i = 0; i < keySize; i++)
{
for (int j = 0; j < keySize; j++)
{
temp[i][j] = key[keySize - j - 1][i];
}
}
key = temp;
}
bool isUnLock(int x, int y, vector<vector<int>> key, vector<vector<int>> board)
{
//board에 key 값을 더한다.
for (int i = x; i < x + keySize; i++)
{
for (int j = y; j < y + keySize; j++)
{
board[i][j] += key[i - x][j - y];
}
}
for (int i = keySize - 1; i <= boardSize - keySize; i++)
{
for (int j = keySize - 1; j <= boardSize - keySize; j++)
{
//1이 아닌 값이 하나라도 있으면 자물쇠를 풀 수 없음.
if (board[i][j] != 1)
return false;
}
}
return true;
}
bool solution(vector<vector<int>> key, vector<vector<int>> lock)
{
keySize = (int)key.size();
lockSize = (int)lock.size();
boardSize = lockSize + (keySize - 1) * 2;
vector<vector<int>> board(boardSize, vector<int>(boardSize));
//보드에 자물쇠를 올린다.
for (int i = keySize - 1; i <= boardSize - keySize; i++)
{
for (int j = keySize - 1; j <= boardSize - keySize; j++)
{
board[i][j] = lock[i - keySize + 1][j - keySize + 1];
}
}
//4번 회전시켜야함
for (int r = 0; r < 4; r++)
{
for (int i = 0; i <= boardSize - keySize; i++)
{
for (int j = 0; j <= boardSize - keySize; j++)
{
if (isUnLock(i, j, key, board))
{
return true;
}
}
}
rotate(key);
}
return false;
}