[프로그래머스✈][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가 깊은거 같다구요? 네 맞습니다. 여러분이 짜실 때는 가능한 많이 줄여서 써주세요.

카카오는 구현능력을 많이 물어보는 것 같다. 하지만 많이 풀어본다면 너도 할 수 있다구!. 우리 사랑스러운 튜브 그림을 보는데 너무 귀엽다.

Series

Algorithms

이 글은 "Algorithms" 시리즈의 6번째 기록입니다.

06 / 27
  1. 01#[프로그래머스][연습문제] 3 x N 타일링 풀이
  2. 02[프로그래머스][2019 kakao] 블록게임 해설
  3. 03[프로그래머스][2019 kakao] 길 찾기 게임 문제 해설
  4. 04[프로그래머스][2019 kakao] 무지의 먹방 라이브 문제 해설
  5. 05[프로그래머스][2019 kakao] 후보키 문제 해설
  6. 06[프로그래머스✈][2020 kakao] 자물쇠와 열쇠 문제 풀이
  7. 07[프로그래머스][2020 kakao] 기둥과 보 설치 문제 해설
  8. 08[프로그래머스✈][2020 kakao] 가사 검색 문제 풀이
  9. 09[백준🔉][16234] 인구이동 문제 해설
  10. 10[프로그래머스✈][2019 kakao 겨울 인턴십] 불량 사용자 문제 해설
  11. 11[프로그래머스✈][2020 kakao] 동굴 탐험
  12. 12[백준🔉][14501] 퇴사 문제 해설
  13. 13[프로그래머스✈][2017 카카오코드] 4단 고음 해설
  14. 14[프로그래머스✈][2019 kakao 겨울 인턴쉽] 징검다리 건너기 해설
  15. 15[프로그래머스✈][연습문제] 섬 연결하기 풀이
  16. 16[leetcode][15] 3sum 문제풀기!
  17. 17[leetcode][16] 3sum closet 문제풀기!
  18. 18[📣top interview question] Remove Duplicates from Sorted Array Solution 문제풀기!
  19. 19[📣top interview question] Best Time to Buy and Sell Stock II 문제풀기!
  20. 20[leetcode][30] Substring with Concatenation of All Words 문제풀기!
  21. 21[leetcode][31] Next Permutation 문제풀기!
  22. 22[leetcode][32] Longest Valid Parentheses 문제풀기
  23. 23[leetcode][40] Combination Sum II 문제풀기!
  24. 24[leetcode][42] Trapping Rain Water 문제풀기!
  25. 25[leetcode][43] Multiply Strings 문제풀기!
  26. 26[leetcode][44] Wildcard Matching 문제풀기!
  27. 27[leetcode][45] Jump Game II 문제풀기!
시리즈 전체 보기