와이유스토리

[시뮬레이션(회전)] (CHECK) 프로그래머스 자물쇠와 열쇠 C++ 본문

코딩테스트/시뮬레이션

[시뮬레이션(회전)] (CHECK) 프로그래머스 자물쇠와 열쇠 C++

유(YOO) 2023. 2. 19. 00:26

 

https://school.programmers.co.kr/learn/courses/30/lessons/60059

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

/*
  정방향  오른쪽 90도  180도   왼쪽 90도 
00 01 02  02 12 22  22 21 20  20 10 00
10 11 12  01 11 21  12 11 10  21 11 01
20 21 22  00 10 20  02 01 00  22 12 02
*/

int N, M, SIZE;
int board[60][60], temp[60][60];

bool checkLock() {
    for(int p=M; p<M+N; p++) {
        for(int q=M; q<M+N; q++) {
            if (temp[p][q] == 0) return false;
        }
    }
    return true;
}

bool checkKey(vector<vector<int>> key, int i, int j) {
    copy(&board[0][0], &board[SIZE-1][SIZE], &temp[0][0]);
    for(int p=0; p<M; p++) {
        for(int q=0; q<M; q++) temp[i+p][j+q] ^= key[p][q];
    }
    if (checkLock()) return true;
    
    copy(&board[0][0], &board[SIZE-1][SIZE], &temp[0][0]);
    for(int p=0; p<M; p++) {
        for(int q=0; q<M; q++) temp[i+p][j+q] ^= key[q][M-p-1]; // 왼쪽 90도 회전
    }
    if (checkLock()) return true;
    
    copy(&board[0][0], &board[SIZE-1][SIZE], &temp[0][0]);
    for(int p=0; p<M; p++) {
        for(int q=0; q<M; q++) temp[i+p][j+q] ^= key[M-p-1][M-q-1]; // 180도 회전
    }
    if (checkLock()) return true;
    
    copy(&board[0][0], &board[SIZE-1][SIZE], &temp[0][0]);
    for(int p=0; p<M; p++) {
        for(int q=0; q<M; q++) temp[i+p][j+q] ^= key[M-q-1][p]; // 오른쪽 90도 회전
    }
    if (checkLock()) return true;
    
    return false;
}

bool solution(vector<vector<int>> key, vector<vector<int>> lock) {
    N = lock.size();
    M = key.size();
    SIZE = N + M * 2;
    fill(&board[0][0], &board[SIZE-1][SIZE], 0); // 60 * 60 * (20 * 20 * 8)
    
    for(int i=0; i<N; i++) {
        for(int j=0; j<N; j++) board[M+i][M+j] = lock[i][j];
    }
    
    for(int i=0; i<SIZE-M; i++) {
        for(int j=0; j<SIZE-M; j++) {
            if (checkKey(key, i, j)) return true;
        }
    }
    
    return false;
}
Comments