๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/Programmers

[C++/PGS] Lv.3 : ์ž๋ฌผ์‡ ์™€ ์—ด์‡ (2020 KAKAO)

by xxilliant 2025. 6. 5.
728x90
๋ฐ˜์‘ํ˜•

 

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

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก์˜ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr


ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ ˆ๋ฒจ 3. ์นด์นด์˜ค ์ฝ”ํ…Œ ๊ธฐ์ถœ ๋ฌธ์ œ์ด๋‹ค

๋‹จ์ˆœ ๊ตฌํ˜„์ธ ๋“ฏ

์ฒ˜์Œ์—๋Š” ์—„์ฒญ ์–ด๋ ค์›Œ ๋ณด์˜€๋Š”๋ฐ, ๋‹จ๊ณ„๋ณ„๋กœ ์„ธ๋ถ„ํ™”ํ•ด์„œ ์ƒ๊ฐํ•˜๋‹ˆ๊นŒ ๋ฐฉ๋ฒ•์ด ๋ณด์˜€๋‹ค!

 

1. key๋ฅผ lock ์œ„์— ๊ฒน์น˜๋ฉด์„œ ํ•œ๋ฒˆ์”ฉ ๋น„๊ตํ•ด์•ผ ํ•˜๋ฏ€๋กœ

    key์˜ ์ผ๋ถ€๊ฐ€ lock ๋ฒ”์œ„ ๋ฐ–์— ์žˆ์–ด๋„ ์•ˆ์ „ํ•˜๋„๋ก lock์˜ ์˜์—ญ์„ ๋„“ํ˜€์ค€๋‹ค. (bigLock ๋ณ€์ˆ˜ ์ƒ์„ฑ)

 

2. key ํšŒ์ „

3. key๋ฅผ bigLock ์œ„์— ์˜ฌ๋ ค์„œ ์Šฌ๋ผ์ด๋”ฉํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋น„๊ต

4. ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋ฏ€๋กœ, ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด ์ฆ‰์‹œ return true

 

์ด์ฐจ์›๋ฐฐ์—ด ํšŒ์ „์‹œํ‚ค๋Š” ๊ฒŒ ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ, ๋ง‰์ƒ ๊ตฌํ˜„ํ•ด๋ณด๋‹ˆ๊นŒ ๋ณ„ ๊ฑฐ ์•„๋‹ˆ์—ˆ๋‹ค...!

 

๋‚˜์˜ ํ’€์ด

#include <string>
#include <vector>
#include <iostream>
using namespace std;

vector<vector<int>> Key;
vector<vector<int>> Lock;
int keySize;
int lockSize;
int bigSize;
vector<vector<int>> bigLock;

// key๋ฅผ ์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „์‹œํ‚ค๋Š” ํ•จ์ˆ˜
void turnKey(){
    vector<vector<int>> k;
    for(int i=0; i<keySize; ++i){
        vector<int> tmp;
        for(int j=0; j<keySize; ++j){
            tmp.push_back(Key[keySize-1-j][i]);
        }
        k.push_back(tmp);
    }
    Key = k;
}

// key ํšŒ์ „ ์ดํ›„ lock๊ณผ ๋น„๊ตํ•˜๋Š” ํ•จ์ˆ˜
bool findKey(int i, int j){
    vector<vector<int>> big(bigLock);
    
    bool isMatch = true;
    // lock 0 ์ด key 0์ด๋ฉด false
    // lock 1์ด key 1์ด๋ฉด false
    // ๋ชจ๋“  lock 0์ด ์ฑ„์›Œ์ง€๋ฉด true
    for(int a=0; a<keySize; ++a){
        for(int b=0; b<keySize; ++b){
            if(bigLock[i+a][j+b]==-1) continue;
            if(bigLock[i+a][j+b]==0){
                if(Key[a][b]==1){
                    // ์ผ์น˜ ์‹œ 99 ๋„ฃ์–ด์ฃผ๊ธฐ
                    big[i+a][j+b] = 99;
                }
                else {
                    isMatch = false; break;
                }
            }
            if(bigLock[i+a][j+b]==1 && Key[a][b]==1){
                isMatch = false; break;
            }
            if(!isMatch) break;
        }
            
    }
    for(int i=keySize; i<lockSize+keySize; ++i){
        for(int j=keySize; j<lockSize+keySize; ++j){
            if(big[i][j]==0) return false;
        }
    }
    return true;
}

bool solution(vector<vector<int>> key, vector<vector<int>> lock) {
    bool answer = true;
    Key = key;
    Lock = lock;
    keySize = key.size();
    lockSize = lock.size();
    bigSize = lockSize+2*keySize;
    
    // lock ์˜์—ญ ๋„“ํžˆ๊ธฐ
    for(int i=0; i<bigSize; ++i){
        vector<int> v;
        for(int j=0; j<bigSize; ++j){
            if(i>=keySize && i<keySize+lockSize 
                && j>=keySize && j<keySize+lockSize){
                v.push_back(lock[i-keySize][j-keySize]);
                continue;
            }
            v.push_back(-1); // ๋ฐ”๊นฅ ๋ฒ”์œ„์—๋Š” -1์„ ์ฑ„์›€
        }
        bigLock.push_back(v);
    }
    
    for(int t=0; t<4; ++t){
        if(t>0){
            turnKey(); // ์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „
        }
        for(int i=1; i<lockSize+keySize; ++i){
            for(int j=1; j<lockSize+keySize; ++j){
                if(findKey(i, j)) return true;
            }
        }
        
    }
    return false;
}

728x90
๋ฐ˜์‘ํ˜•