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

adultlee·2023년 6월 12일
0

프로그래머스 3단계

목록 보기
20/39
post-custom-banner

문제 링크

프로그래머스 문제

풀이

문제가 다소 난해하여 푸는데 꽤나 많은시간이 걸렸다.
특히 회전시키는 부분이 어려웟는데, 다시 생각해보니 열쇠의 회전 부분은 3번만 진행하면 된다.
굳이 모든 위치에서 회전을 확인할 필요가 없으므로 회전 시킨 이후 큰 배열을 선언후 확인하면 풀 수 있다.

//(y,x) => (x, n-y) 회전에 관련된 함수에서 가져왔습니다. 
// 다소 헷갈리지만 작은 배열부터 만들어가며 관계식을 찾아봅니다.
    for(let i=0; i<KEYLEN; i++){
        for(let j=0; j<KEYLEN; j++){
            rotatedKey[i][j] += key[KEYLEN-j-1][i]
        }
    }

코드

function solution(key, lock) {
    var answer = true;
    const KEYLEN = key.length
    const LOCKLEN = lock.length
    
    let board = makeBoard(KEYLEN , LOCKLEN , lock );// 전체 lock이 포함될만큼 큰 배열을 만들어줍니다. 
    // 이 배열의 내부에서 key를 회전시켜가며 딱 들어맞는지 확인합니다.
    
    for(let dir=0; dir< 4; dir++){
        // 방향회전 4번을 진행합니다. 
        key = rotation(KEYLEN, key); // 한번 회전시킨 함수를 반복하여 회전시킵니다. 
        
        for(let i=0; i<KEYLEN+LOCKLEN+1; i++){
            // 아래로 이동합니다.
            for(let j=0; j<KEYLEN+LOCKLEN+1; j++){
                // 오른쪽으로 이동합니다. 
                board = drawKey(i,j,key,board)

                if(isAnswer (KEYLEN,LOCKLEN, board)){
                    return true
                }
                
                    board = makeBoard(KEYLEN , LOCKLEN , lock )
                
            }
        }
    }
    return false;
}

function drawKey(startY, startX,key, board){
    for(let i=0; i<key.length; i++ ){
        for(let j=0; j<key.length; j++){
            board[startY+i][startX+j]+= key[i][j]
        }
    }
    
    return board
}

function rotation (KEYLEN,key) { // key 를 받고 회전을 시킬겁니다.
    const rotatedKey = [];
    
    for(let i=0; i<KEYLEN; i++){
        rotatedKey.push([])
        for(let j=0; j<KEYLEN; j++){
            rotatedKey[i].push(0)
        }
    }
    //(y,x) => (x, n-y)
    for(let i=0; i<KEYLEN; i++){
        for(let j=0; j<KEYLEN; j++){
            rotatedKey[i][j] += key[KEYLEN-j-1][i]
        }
    }
    
    return rotatedKey
    // 결과로 배열을 반환합니다. 
}

function makeBoard (KEYLEN, LOCKLEN, lock){
    const board =[];
    const boardSize = 2*KEYLEN + LOCKLEN
    for(let i=0; i< boardSize; i++){
        board.push([])
        for(let j=0; j<boardSize; j++){
            board[i].push(0)
        }
    }

    for(let i=0; i<LOCKLEN; i++){
        for(let j=0; j< LOCKLEN; j++){
            board[KEYLEN+i][KEYLEN+j] += lock[i][j]
        }
    }
    return board
}

function isAnswer (KEYLEN,LOCKLEN, board){
    for(let i=0; i<LOCKLEN; i++){
        for(let j=0; j< LOCKLEN; j++){
            if(board[KEYLEN+i][KEYLEN+j] !== 1)
            return false
        }
    }
    return true;
}

post-custom-banner

0개의 댓글