https://programmers.co.kr/learn/courses/30/lessons/60059
#include <string>
#include <vector>
#include <iostream>
#include <cstring>
using namespace std;
const int MAX = 80;
int l[MAX][MAX];
struct MOVE { int x, y; };
MOVE mv[4] = { { 1,0 },{ -1,0 },{ 0,1 },{ 0,-1 } };
int sz;
vector<vector<int>> keys;
bool CheckRight(int tmp[MAX][MAX]) {
for (int i = sz; i < sz * 2; i++) {
for (int j = sz; j < sz * 2; j++) {
if (tmp[i][j] + l[i][j] != 1) return false;
}
}
return true;
}
bool Rotatekey(int mi,int mj) {
bool ans = false;
vector<vector<int>> tmp_keys,tmp_keys2;
tmp_keys = keys;
tmp_keys2 = keys;
//90도씩 4번 회전
for (int k = 0; k < 4; k++) {
for (int i = 0; i < keys.size(); i++) {
for (int j = 0; j < keys.size(); j++) {
keys[i][j] = tmp_keys[keys.size() - j - 1][i];
}
}
tmp_keys = keys;
int tmp[MAX][MAX];
memset(tmp, 0, sizeof(tmp));
for (int i = mi, ci = 0; i < mi + keys.size(); i++,ci++) {
for (int j = mj, cj = 0; j < mj + keys.size(); j++,cj++) {
tmp[i][j] = keys[ci][cj];
}
}
if (CheckRight(tmp) == true) {
ans = true;
break;
}
}
keys = tmp_keys2;
return ans;
}
bool solution(vector<vector<int>> key, vector<vector<int>> loc) {
bool answer = true;
sz = loc.size();
memset(l, 0, sizeof(l));
keys = key;
for (int i = sz; i < sz * 2; i++) {
for (int j = sz; j < sz * 2; j++) {
l[i][j] = loc[i - sz][j - sz];
}
}
for (int i = 0; i < sz * 3; i++) {
for (int j = 0; j < sz * 3; j++) {
if (Rotatekey(i, j) == true) {
return true;
}
}
}
return false;
}
'프로그래머스' 카테고리의 다른 글
다단계 칫솔 C++ (0) | 2021.10.03 |
---|---|
불량 사용자 C++ (0) | 2021.10.02 |
매출 하락 최소화 C++ (0) | 2021.08.09 |
괄호 변환 C++ (0) | 2021.08.08 |
카드 짝 맞추기 C++ (0) | 2021.08.01 |