본문 바로가기
프로그래머스

자물쇠와 열쇠 C++

by paysmile 2021. 8. 22.

https://programmers.co.kr/learn/courses/30/lessons/60059

 

코딩테스트 연습 - 자물쇠와 열쇠

[[0, 0, 0], [1, 0, 0], [0, 1, 1]] [[1, 1, 1], [1, 1, 0], [1, 0, 1]] true

programmers.co.kr

#include <string>
#include <vector>
#include <iostream>
#include <cstring>

using namespace std;
const int MAX = 80;
int l[MAX][MAX];
struct MOVE { int x, y; };
MOVE mv[4] = { { 1,0 },{ -1,0 },{ 0,1 },{ 0,-1 } };
int sz;
vector<vector<int>> keys;

bool CheckRight(int tmp[MAX][MAX]) {
	for (int i = sz; i < sz * 2; i++) {
		for (int j = sz; j < sz * 2; j++) {
			if (tmp[i][j] + l[i][j] != 1) return false;
		}
	}
	return true;
}

bool Rotatekey(int mi,int mj) {
	bool ans = false;
	vector<vector<int>> tmp_keys,tmp_keys2;
	tmp_keys = keys;
	tmp_keys2 = keys;

	//90도씩 4번 회전
	for (int k = 0; k < 4; k++) {
		for (int i = 0; i < keys.size(); i++) {
			for (int j = 0; j < keys.size(); j++) {
				keys[i][j] = tmp_keys[keys.size() - j - 1][i];
			}
		}
		tmp_keys = keys;
		int tmp[MAX][MAX];
		memset(tmp, 0, sizeof(tmp));

		for (int i = mi, ci = 0; i < mi + keys.size(); i++,ci++) {
			for (int j = mj, cj = 0; j < mj + keys.size(); j++,cj++) {
				tmp[i][j] = keys[ci][cj];
			}
		}

		if (CheckRight(tmp) == true) {
			ans = true;
			break;
		}
	}
	keys = tmp_keys2;
	return ans;
}

bool solution(vector<vector<int>> key, vector<vector<int>> loc) {
	bool answer = true;
	sz = loc.size();
	memset(l, 0, sizeof(l));
	keys = key;

	for (int i = sz; i < sz * 2; i++) {
		for (int j = sz; j < sz * 2; j++) {
			l[i][j] = loc[i - sz][j - sz];
		}
	}
	for (int i = 0; i < sz * 3; i++) {
		for (int j = 0; j < sz * 3; j++) {
			if (Rotatekey(i, j) == true) {
				return true;
			}
		}
	}
	return false;
}

'프로그래머스' 카테고리의 다른 글

다단계 칫솔 C++  (0) 2021.10.03
불량 사용자 C++  (0) 2021.10.02
매출 하락 최소화 C++  (0) 2021.08.09
괄호 변환 C++  (0) 2021.08.08
카드 짝 맞추기 C++  (0) 2021.08.01