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 |
Tags
- 걷는건귀찮아
- 회의실 배정
- SWEA
- 2020 KAKAO BLIND RECRUITMENT
- 알고리즘
- AI Hub
- 문자열 압축
- 유니티
- MySQL
- 윈도우
- 탄막 이동
- 토글 그룹
- 백준
- 마우스 따라다니기
- 수 만들기
- 탄막
- 그리디알고리즘
- 영상 프레임 추출
- 알고리즘 목차
- 강의실2
- 18249
- 우분투
- 단어 수학
- 3273
- 자료구조 목차
- 탄막 스킬 범위
- 3344
- mysqld.sock
- c#
- 원형
Archives
- Today
- Total
와이유스토리
[시뮬레이션(회전)] (CHECK) 프로그래머스 자물쇠와 열쇠 C++ 본문
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;
}
'코딩테스트 > 시뮬레이션' 카테고리의 다른 글
[시뮬레이션(회전)] (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