몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 3] 자물쇠와 열쇠 {언어 : JavaScript} [다시 풀어 보기] 본문

알고리즘/다시 풀어 보기

프로그래머스 [Lv. 3] 자물쇠와 열쇠 {언어 : JavaScript} [다시 풀어 보기]

스위태니 2024. 7. 10. 04:21

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/60059?language=javascript

 

프로그래머스

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

programmers.co.kr

정답 코드

function rotateKey(key) {
    const n = key.length;
    const rotatedKey = Array.from({ length: n }, () => Array(n).fill(0));
    
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) {
            rotatedKey[j][n - 1 - i] = key[i][j];
        }
    }
    
    return rotatedKey;
}

function canUnlock(key, lock, xOffset, yOffset) {
    const n = lock.length;
    const m = key.length;
    const extendedLock = Array.from({ length: 2 * m + n }, () => Array(2 * m + n).fill(0));
    
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) {
            extendedLock[m + i][m + j] = lock[i][j];
        }
    }
    
    for (let i = 0; i < m; i++) {
        for (let j = 0; j < m; j++) {
            extendedLock[m + i + xOffset][m + j + yOffset] += key[i][j];
        }
    }
    
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) {
            if (extendedLock[m + i][m + j] !== 1) {
                return false;
            }
        }
    }
    
    return true;
}

function solution(key, lock) {
    const n = lock.length;
    const m = key.length;
    
    for (let rotation = 0; rotation < 4; rotation++) {
        for (let xOffset = -m + 1; xOffset < n; xOffset++) {
            for (let yOffset = -m + 1; yOffset < n; yOffset++) {
                if (canUnlock(key, lock, xOffset, yOffset)) {
                    return true;
                }
            }
        }
        key = rotateKey(key);
    }
    
    return false;
}

풀이 방법

 

  1. key 회전: key를 90도씩 회전시키는 함수를 작성한다. 총 4번 회전시켜 각각의 경우를 모두 확인한다.
  2. key를 lock의 모든 위치에 맞춰보기: key의 크기가 lock의 크기보다 작으므로 key를 lock의 범위 내에서 모든 위치에 맞춰본다. 이때 key의 돌기 부분이 lock의 홈 부분과 정확히 일치하는지 확인한다. 또한, key의 돌기가 lock의 돌기와 겹치면 안 된다.
  3. 확인 함수: 현재 key와 lock이 맞물리는지 확인하는 함수를 작성한다.

 

느낀점

  • 거의 다 풀었지만 틀렸고 처음부터 차근차근 다시 풀어보는 게 좋을 것 같다.