코테/구현

[C/C++] 프로그래머스스쿨 자물쇠와 열쇠, 구현

상똥 2023. 2. 26. 00:31

문제

코딩테스트 연습 - 자물쇠와 열쇠 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드

#include <iostream>
#include <vector>

using namespace std;

//키 회전
vector<vector<int>> rotation(vector<vector<int>> key) {
	int n = key.size();//행 길이
	int m = key[0].size();//열 길이
	vector<vector<int>> result(n, vector<int>(m));//열이 m, 행이 n인 2차원 벡터
	for (int i = 0; i < n; i++){ 
		for (int j = 0; j < m; j++){ 
			result[j][n - i - 1] = key[i][j];
        }
    }
	return result;
}

//자물쇠+열쇠 값 확인
bool check(vector<vector<int>> lock) {
	int length = lock.size() / 3;
	for (int i = length; i < length * 2; i++) {
		for (int j = length; j < length * 2; j++){
			if (lock[i][j] != 1){
                return false;
            }
        }
    }
				
	return true;
}

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

	vector<vector<int>> n_lock(n * 3, vector<int>(n * 3));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++){ 
			n_lock[i + n][j + n] = lock[i][j];
        }
    }
	//기존 자물쇠의 크기를 세 배로 만든 후, 가운데에 기존 자물쇠 위치시킴

	for (int r = 0; r < 4; r++) {//열쇠가 회전하는 4번 동안 확인하기
		for (int x = 0; x < n * 2; x++) {
			for (int y = 0; y < n * 2; y++) {
				for (int i = 0; i < m; i++) {
					for (int j = 0; j < m; j++) {
						n_lock[x + i][y + j] += key[i][j];	
						//열쇠와 자물쇠의 같은 자리의 값을 합하여
						//모두 1이면 열리는 것!!!!!
					}
				}
				if (check(n_lock)==true)//합해진 자리의 값들이 1인지 확인
					return true;
				for (int i = 0; i < m; i++) {//한 자리라도 1이 아니라면 다시 빼기
					for (int j = 0; j < m; j++) {
						n_lock[x + i][y + j] -= key[i][j];
					}
				}
			}
		}
        key = rotation(key);//열쇠 회전
	}
	return false;//네 번 회전해도 맞지 않으면 안열리는 것
}