Developer with Cat
© 2021. All rights reserved.
#[프로그래머스✈][2020 kakao] 자물쇠와 열쇠 문제 풀이
고고학자로 위장한 도굴꾼 튜브는 고대 유적지에서 자물쇠를 발견했습니다. 가지고 있는 열쇠가 이 자물쇠에 맞는지 사방으로 끼워보고 돌려서도 끼워보고 해서 자물쇠를 열어 발굴할 수 있는지 확인하려고 합니다. 문제를 푸시오.
자세한 문제 설명과 제한 사항은 프로그래머스 홈페이지 참고. 문제풀러가기
20x20의 크기의 board에 열쇠가 맞는지 모든 케이스를 맞춰보는 겁니다. 여러분 이건 어려운게 아니라 귀찮은 문제 입니다.
이 녀석을 혼쭐 내줍시다.
해당소스는 프로그래머스에서 풀고 바로 가져온 코드 입니다.
키를 만들고 사방으로 끼우고 돌려서도 끼우고 다 해봅니다. 노동은 컴퓨터가 하잖아요?
#include <string> #include <vector> using namespace std; void makeMyKey(vector<vector<int>>& key); void makeMyTempKey(vector<vector<int>>& tempKey, int dir, int x, int y, int keysize, int locksize); bool check(vector<vector<int>>& tempKey, vector<vector<int>>& lock); int mykey[4][32][32]; bool solution(vector<vector<int>> key, vector<vector<int>> lock) { makeMyKey(key); vector<vector<int>> tempKey(lock.size(), vector<int>(lock.size(), 0)); for (int i = 0; i <= key.size() + lock.size(); i++) { for (int j = 0; j <= key.size() + lock.size(); j++) { for (int k = 0; k < 4; k++) { makeMyTempKey(tempKey, k, j, i, key.size(), lock.size()); if (check(tempKey,lock)) { return true; } } } } return false; } void makeMyKey(vector<vector<int>>& key) { int length = key.size(); for (int i = 0, _i = 0; i < length; i++, _i++) for (int j = 0, _j = 0; j < length; j++, _j++) mykey[0][i][j] = key[i][j]; for (int i = 0, _i = 0; i < length; i++, _i++) for (int j = 0, _j = length - 1; j < length; j++, _j--) mykey[1][i][j] = key[_j][_i]; for (int i = 0, _i = 0; i < length; i++, _i++) for (int j = 0, _j = length - 1; j < length; j++, _j--) mykey[2][i][j] = mykey[1][_j][_i]; for (int i = 0, _i = 0; i < length; i++, _i++) for (int j = 0, _j = length - 1; j < length; j++, _j--) mykey[3][i][j] = mykey[2][_j][_i]; } void makeMyTempKey(vector<vector<int>>& tempKey, int dir, int x, int y, int keysize, int locksize) { int keyX = keysize - x; int keyY = keysize - y; for (int i = 0,_i = keyY; i < locksize; i++, _i++) { for (int j = 0, _j = keyX; j < locksize; j++, _j++) { if (_j >= keysize || _j < 0 || _i >= keysize || _i < 0) { tempKey[i][j] = 0; } else { tempKey[i][j] = mykey[dir][_i][_j]; } } } } bool check(vector<vector<int>>& tempKey, vector<vector<int>>& lock) { int length = lock.size(); for (int i = 0; i < length; i++) { for (int j = 0; j < length; j++) { if (lock[i][j] + tempKey[i][j] == 0 || lock[i][j] + tempKey[i][j] == 2) return false; } } return true; }
Depth가 깊은거 같다구요? 네 맞습니다. 여러분이 짜실 때는 가능한 많이 줄여서 써주세요.
카카오는 구현능력을 많이 물어보는 것 같다. 하지만 많이 풀어본다면 너도 할 수 있다구!. 우리 사랑스러운 튜브 그림을 보는데 너무 귀엽다.