https://www.welcomekakao.com/learn/challenges?tab=all_challenges

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

www.welcomekakao.com

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

using namespace std;

int arr[80][80];
int copyKey[20][20];
int temp[80][80];
int Key[20][20];

void rotate(int M){
    for(int i=0;i<M;i++){
        for(int j=0;j<M;j++){
            copyKey[i][j]=Key[M-1-j][i];
        }
    }
    memcpy(Key,copyKey,sizeof(Key));
}

bool chking(int M, int N){

    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            if(temp[M-1+i][M-1+j]==2||temp[M-1+i][M-1+j]==0){
                return false;
            }
        }
    }
    return true;
}

bool solution(vector<vector<int>> key, vector<vector<int>> lock) {
    bool answer = false;
    
    int M = key.size();
    int N = lock.size();
    int c=4;
    
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            arr[M-1+i][M-1+j]=lock[i][j];
        }
    }
    for(int i=0;i<M;i++){
        for(int j=0;j<M;j++){
            Key[i][j]=key[i][j];
        }
    }
    
    while(c--&&!answer){
        //temp에 돌려가면서 key 복사
        rotate(M);
        for(int i=0;i<2*N+M-2;i++){
            for(int j=0;j<2*N+M-2;j++){
                memcpy(temp,arr,sizeof(temp));
                for(int k=0;k<N;k++){
                    for(int l=0;l<N;l++){
                        temp[i+k][j+l]+=Key[k][l];
                    }
                }
                answer = chking(M,N);
                if(answer)  break;
            }
            if(answer)  break;
        }
    }
    
    
    return answer;
}

+ Recent posts