개발/알고리즘

프로그래머스 자물쇠와 열쇠 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;
}