[프로그래머스] 자물쇠와 열쇠

업데이트:

프로그래머스 자물쇠와 열쇠 풀이입니다.

이 문제는 완전탐색 시뮬레이션이다.

하지만 배열을 회전시키고 또 확장 시키는 것이 어색하다면 풀기 굉장히 어려운 문제가 될 수 있다.

접근법은 간단하다. 키를 회전시키면서 이동시켜가며 자물쇠와 모든 부분이 맞물리는지 확인하고 맞물리는게 확인되면 true를 리턴하고 아니면 false를 리턴시키면 된다.

Problem : 자물쇠와 열쇠

Source Code(C++) :

#include <string>
#include <vector>

using namespace std;

int CNT, M, N;

void Rotate(vector<vector<int>>& key) { // 90도 회전 
	vector<vector<int> > tmp(M, vector<int>(M, 0));
	for (int i = 0; i < M; i++)
		for (int j = 0; j < M; j++)
			tmp[j][M - i - 1] = key[i][j];
	key = tmp;
}


bool solution(vector<vector<int>> key, vector<vector<int>> lock) {
	M = key.size();
	N = lock.size();

	bool result = true;

	for (int i = 0; i < N; i++)
		for (int j = 0; j < N; j++)
			if (lock[i][j] == 0)
				CNT++; // 홈 갯수 

	for (int rotate = 0; rotate < 4; rotate++) {
		for (int i = -20; i <= 20; i++) {
			for (int j = -20; j <= 20; j++) {
				int cnt = 0;
				result = false;
				for (int x = 0; x < M; x++) {
					for (int y = 0; y < M; y++) {
						int nx = x + j;
						int ny = y + i;
						if (0 <= ny && ny < N && 0 <= nx && nx < N) {
							if (lock[ny][nx] == 1 && key[y][x] == 1) result = true;
							else if (lock[ny][nx] == 0 && key[y][x] == 1) cnt++;
						}
					}
				}
				if (cnt == CNT && !result) return true;
			}
		}
		Rotate(key);
	}


	return false;
}

소스코드

이 외에도 제가 푼 문제들 소스코드는 다음 링크에 있습니다!!! 알고리즘 문제풀이

댓글남기기