문제
코딩테스트 연습 - 자물쇠와 열쇠 | 프로그래머스 스쿨 (programmers.co.kr)
코드
#include <iostream>
#include <vector>
using namespace std;
//키 회전
vector<vector<int>> rotation(vector<vector<int>> key) {
int n = key.size();//행 길이
int m = key[0].size();//열 길이
vector<vector<int>> result(n, vector<int>(m));//열이 m, 행이 n인 2차원 벡터
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
result[j][n - i - 1] = key[i][j];
}
}
return result;
}
//자물쇠+열쇠 값 확인
bool check(vector<vector<int>> lock) {
int length = lock.size() / 3;
for (int i = length; i < length * 2; i++) {
for (int j = length; j < length * 2; j++){
if (lock[i][j] != 1){
return false;
}
}
}
return true;
}
bool solution(vector<vector<int>> key, vector<vector<int>> lock) {
int n = lock.size();
int m = key.size();
vector<vector<int>> n_lock(n * 3, vector<int>(n * 3));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++){
n_lock[i + n][j + n] = lock[i][j];
}
}
//기존 자물쇠의 크기를 세 배로 만든 후, 가운데에 기존 자물쇠 위치시킴
for (int r = 0; r < 4; r++) {//열쇠가 회전하는 4번 동안 확인하기
for (int x = 0; x < n * 2; x++) {
for (int y = 0; y < n * 2; y++) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++) {
n_lock[x + i][y + j] += key[i][j];
//열쇠와 자물쇠의 같은 자리의 값을 합하여
//모두 1이면 열리는 것!!!!!
}
}
if (check(n_lock)==true)//합해진 자리의 값들이 1인지 확인
return true;
for (int i = 0; i < m; i++) {//한 자리라도 1이 아니라면 다시 빼기
for (int j = 0; j < m; j++) {
n_lock[x + i][y + j] -= key[i][j];
}
}
}
}
key = rotation(key);//열쇠 회전
}
return false;//네 번 회전해도 맞지 않으면 안열리는 것
}
'코테 > 구현' 카테고리의 다른 글
[C/C++] 백준 치킨 배달, 구현 (0) | 2023.02.26 |
---|---|
[C/C++] 프로그래머스 스쿨 기둥과 보, 구현 (0) | 2023.02.26 |
[C/C++] 백준 3190, 구현 (0) | 2023.02.18 |
[C/C++] 프로그래머스스쿨 문자열압축, 구현 (0) | 2023.02.16 |
[C/C++] 나동빈 문자열 재정렬, 구현 (0) | 2023.02.15 |