문제 링크입니다: https://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
특별한 알고리즘을 요구하지 않는 구현 문제였습니다.
해당 문제는 아래의 전개도를 연상하고 이차원 배열 90도 회전을 구현할 수 있다면 쉽게 풀 수 있었을 문제였습니다.

This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <string> | |
#include <vector> | |
using namespace std; | |
int M, N; | |
vector<vector<int>> board; | |
bool canUnlock(int y, int x, vector<vector<int>> &key) | |
{ | |
bool flag = true; | |
for (int curY = y; curY < y + M; curY++) | |
{ | |
for (int curX = x; curX < x + M; curX++) | |
{ | |
board[curY][curX] += key[curY - y][curX - x]; | |
} | |
} | |
for (int curY = M; curY < M + N; curY++) | |
{ | |
for (int curX = M; curX < M + N; curX++) | |
{ | |
if (board[curY][curX] != 1) | |
{ | |
flag = false; | |
break; | |
} | |
} | |
if (flag == false) | |
{ | |
break; | |
} | |
} | |
for (int curY = y; curY < y + M; curY++) | |
{ | |
for (int curX = x; curX < x + M; curX++) | |
{ | |
board[curY][curX] -= key[curY - y][curX - x]; | |
} | |
} | |
return flag; | |
} | |
void rotate(vector<vector<int>> &key) | |
{ | |
vector<vector<int>> temp(M, vector<int>(M)); | |
for (int y = 0; y < M; y++) | |
{ | |
for (int x = 0; x < M; x++) | |
{ | |
temp[y][x] = key[x][M - (y + 1)]; | |
} | |
} | |
for (int y = 0; y < M; y++) | |
{ | |
for (int x = 0; x < M; x++) | |
{ | |
key[y][x] = temp[y][x]; | |
} | |
} | |
} | |
void init(vector<vector<int>> &key, vector<vector<int>> &lock) | |
{ | |
M = key.size(); | |
N = lock.size(); | |
board = vector<vector<int>>(2 * M + N, vector<int>(2 * M + N)); | |
} | |
bool solution(vector<vector<int>> key, vector<vector<int>> lock) { | |
init(key, lock); | |
for (int y = M; y < M + N; y++) | |
{ | |
for (int x = M; x < M + N; x++) | |
{ | |
board[y][x] = lock[y - M][x - M]; | |
} | |
} | |
for (int y = 0; y < M + N; y++) | |
{ | |
for (int x = 0; x < M + N; x++) | |
{ | |
for (int k = 0; k < 4; k++) | |
{ | |
if (canUnlock(y, x, key)) | |
{ | |
return true; | |
} | |
rotate(key); | |
} | |
} | |
} | |
return false; | |
} |

개발환경: Programmers IDE
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
반응형
'알고리즘 > programmers' 카테고리의 다른 글
[Programmers] 3 x n 타일링 (0) | 2022.06.01 |
---|---|
[Programmers] 2 x n 타일링 (0) | 2022.06.01 |
[Programmers] [1차] 추석 트래픽 (0) | 2022.04.18 |
[Programmers] [1차] 셔틀버스 (0) | 2022.04.15 |
[Programmers] 브라이언의 고민 (3) | 2022.03.18 |