728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/60059
풀이
이 문제는 하드한 구현 문제이다.
key가 되는 배열의 크기를 (자물쇠의 크기 * 3) - 2 크기로 만들어 주어 자물쇠가 배열안에 들어가 체크가 가능하게 만들어 주어야 한다. 이는 열쇠가 자물쇠 밖으로 이동해도 된다는 조건을 구현한 것이다.
또한 열쇠의 회전도 구현해야 한다. 회전의 경우 배열 회전 문제에서 많이 봤던 로직을 이용하면 되는데, 열쇠의 가로줄이 새로운 열쇠 배열의 세로줄이 된다. 이 점을 참고해 열쇠의 회전을 구현하면 된다.
이렇게 새로운 열쇠 배열을 구했으면 검증을 시작하면 되는데, 자물쇠가 열쇠 안에 들어가 검증하는 동작을 구현해야 한다. 이는 새로운 배열의 0번 인덱스부터 전체 길이 - 자물쇠 길이 까지 반복문을 이용해 순회하며 시작점을 얻어내고, 자물쇠의 값들과 비교하며 순회하다가 조건에 맞지 않는 값이 있는 경우 탈출해 다음 시작점의 검증을 시작한다.
코드
function solution(key, lock) {
const kL = key.length;
const lL = lock.length;
const tCnt = lock.reduce((acc, cur) => acc + cur.reduce((a, c) => a + (c === 0 ? 1 : 0), 0), 0);
let keys = [key];
for (let i = 0; i < 3; i++) {
const rotated = Array.from({ length: kL }, () => Array.from({ length: kL }, () => 0));
for (let j = 0; j < kL; j++) {
for (let k = 0; k < kL; k++) {
rotated[j][k] = keys[i][kL - k - 1][j];
}
}
keys.push(rotated)
}
for (let i = 0; i < keys.length; i++) {
const res = Array.from({ length: 3 * lL - 2 }, () => Array.from({ length: 3 * lL - 2 }, () => 0));
keys[i].forEach((el, idx) => {
el.forEach((e, id) => {
res[idx + lL - 1][id + lL - 1] = e;
})
})
keys[i] = res;
}
for (let i = 0; i < keys.length; i++) {
const ke = keys[i];
const keyL = ke.length;
for (let j = 0; j < keyL - lL; j++) {
for (let k = 0; k < keyL - lL; k++) {
let flag = false;
for (let ij = 0; ij < lL; ij++) {
for (let ik = 0; ik < lL; ik++) {
if (lock[ij][ik] === 1 && ke[ij + j][ik + k] === 0) continue;
else if (lock[ij][ik] === 0 && ke[ij + j][ik + k] === 1) continue;
else {
flag = true;
break;
}
}
if (flag) break;
}
if (!flag) return true;
}
}
}
return false;
}
728x90
'코딩 테스트 > 프로그래머스 코딩 테스트 연습' 카테고리의 다른 글
[JS] 유사 칸코어 비트열 (0) | 2024.10.29 |
---|---|
[JS] 괄호 변경 (0) | 2024.10.04 |
[JS] 양과 늑대 (0) | 2024.10.01 |
[JS] 표편집 (1) | 2024.09.30 |
[JS] 파괴되지 않은 건물 (0) | 2024.09.29 |