1. 문제
제한사항
- board 배열은 2차원 배열로 크기는 "5 x 5" 이상 "30 x 30" 이하입니다.
- board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
- 0은 빈 칸을 나타냅니다.
- 1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
- moves 배열의 크기는 1 이상 1,000 이하입니다.
- moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.
입출력 예
boards | moves | result |
[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] | [1,5,3,5,1,2,1,4] | 4 |
입출력 예 설명
입출력 예 #1
인형의 처음 상태는 문제에 주어진 예시와 같습니다. 크레인이 [1, 5, 3, 5, 1, 2, 1, 4] 번 위치에서 차례대로 인형을 집어서 바구니에 옮겨 담은 후, 상태는 아래 그림과 같으며 바구니에 담는 과정에서 터트려져 사라진 인형은 4개 입니다.
2. 정답 풀이
풀이 전략
- 스택 구조를 활용
- board를 순회하며 실제 이미지에 인형이 배치된 것처럼 구성된 stack이라는 배열을 만든다.
- 0은 빈칸이기 때문에 0을 제외한 나머지로 stack을 구성
- moves 배열을 순회하며 stack[move-1]이 빈 배열이 아니라면(인형이 있는 경우) pop 하고 popValue 변수에 할당한다.
- popValue를 바구니를 의미하는 pocket 스택에 push 한다.
- push 할 때 스택의 마지막 값과 추가하려는 값이 같다면(같은 인형인 경우) pocket.pop()을 통해 마지막 값을 제거하고 answer += 2로 삭제된 인형을 2개 추가한다.
function solution(board, moves) {
let answer = 0
const BOARD_LENGTH = board.length
const stack = new Array(BOARD_LENGTH).fill([])
const pocket = []
for(let i=0; i<BOARD_LENGTH; i++) {
for(let j=0; j<BOARD_LENGTH; j++) {
const num = board[BOARD_LENGTH - 1 - j][i]
if (num > 0) stack[i] = [...stack[i], num]
}
}
moves.map(move => {
const popValue = stack[move-1].length > 0 ? stack[move-1].pop() : -1;
if(popValue === pocket[pocket.length-1]) {
pocket.pop()
answer += 2
} else if(popValue > -1) {
pocket.push(popValue)
}
})
return answer
}
느낀 점
- 문제를 읽고 인형을 추가하고 삭제하는 과정에서 스택 구조가 떠오른 걸 보면, 문제 접근 방식이 성장하고 있는 것 같다.
- 변수명은 여전히 직관적이지 못한것 같다. 코드 작성할때 신경쓰자!
- 문제 풀이를 설명할 때도 다른 사람이 이해하기 쉽게 풀어쓰는 연습이 필요할 것 같다..😅
'코딩 테스트 > 프로그래머스(LV1)' 카테고리의 다른 글
[프로그래머스] 성격 유형 검사하기 (LV1 - JavaScript) (5) | 2024.10.22 |
---|---|
[프로그래머스] 키패드 누르기 (LV1 - JavaScript) (2) | 2024.10.21 |
[프로그래머스] 햄버거 만들기 (LV1 - JavaScript) (1) | 2024.10.20 |
[프로그래머스] 숫자 짝꿍 (LV1 - JavaScript) (3) | 2024.10.19 |
[프로그래머스] 체육복 (LV1 - JavaScript) (0) | 2024.10.16 |