Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 알고리즘 목차
- 문자열 압축
- 3273
- 토글 그룹
- 그리디알고리즘
- 단어 수학
- 백준
- MySQL
- 18249
- AI Hub
- 마우스 따라다니기
- mysqld.sock
- 윈도우
- c#
- 우분투
- 강의실2
- 2020 KAKAO BLIND RECRUITMENT
- 회의실 배정
- 유니티
- 자료구조 목차
- 탄막
- 3344
- 수 만들기
- 원형
- 탄막 스킬 범위
- 영상 프레임 추출
- 알고리즘
- SWEA
- 걷는건귀찮아
- 탄막 이동
Archives
- Today
- Total
와이유스토리
[시뮬레이션(회전)] (CHECK) 프로그래머스 자물쇠와 열쇠 C++ 본문
https://school.programmers.co.kr/learn/courses/30/lessons/60059
#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;
}
'코딩테스트 > 시뮬레이션' 카테고리의 다른 글
[시뮬레이션(회전)] (CHECK) 백준 20057 마법사 상어와 토네이도 C++ (0) | 2023.03.31 |
---|---|
[시뮬레이션] 프로그래머스 퍼즐 조각 채우기 C++ (0) | 2023.03.28 |
[시뮬레이션] 프로그래머스 [1차] 프렌즈4블록 C++ (0) | 2022.03.03 |
[시뮬레이션] 백준 20056 마법사 상어와 파이어볼 C++ (0) | 2022.02.08 |
[시뮬레이션] 백준 19237 어른 상어 C++ (0) | 2022.02.07 |
Comments