https://school.programmers.co.kr/learn/courses/30/lessons/64061
크레인이 움직여 인형을 뽑는데 뽑는 확률은 무조건이며 만약 해당 라인에 아무것도 없다면 아무일도 일어나지 않는다. 뽑힌 인형은 바구니에 쌓이며 바구니에 연속으로 2개의 인형이 쌓이면 해당 인형은 사라진다.
이 때 연속으로 쌓여 사라진 인형의 개수를 구하시오.
예제로 주어진 입력 값은 다음과 같다.
board
[[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]]
moves
[1,5,3,5,1,2,1,4]
주어진 board를 나타내면 다음과 같다
맨 처음에 오는 moves의 값이 1이므로 첫 번째 라인에서 0을 무시하고 숫자가 오는 4가 가장 먼저 바구니에 쌓인다. 이 때 4는 바구니로 옮겨졌으므로 0으로 바뀐다.
(현재 바구니 [4])
다음으로 오는 moves의 값이 5이므로 다섯 번째 라인에서 0을 무시하고 숫자가 오는 3이 바구니에 쌓인다. 이 때 3은 바구니로 옮겨졌으므로 0으로 바뀐다.
현재 바구니 [4, 3]
이렇게 과정이 반복되면 바구니에 연속으로 같은 숫자가 쌓이는 순간이 존재하게 된다.
이 문제는 우리가 흔히 아는 같은 그림이 반복되면 사라지는 게임이라면 같아서 사라지면 다른 그림이 위에서 내려오며 같은 그림이 일치하는 경우가 생겨 없어지는 과정이 여러 번 반복될 수 있지만, 이 문제는 없어지고 다른 숫자가 다시 생기지 않기 때문에 로직 상 숫자가 연속되는 현상은 바구니에 새로운 인형이 뽑혀져왔을 때 한 순간에만 존재할 수 있다.
따라서 뽑혀져 나온 후에 같은 숫자가 연속으로 존재한다면 두 숫자를 없애주고 없어진 인형의 개수를 세는 카운트에 +2를 해준다.
moves의 길이만큼 과정을 반복하여 마지막에 없어진 인형의 개수를 세는 카운트를 return해준다.
function solution(board, moves) {
let result = 0
let arr = []
moves.map(el => {
for(let i = 0; i < board.length; i++) {
if(board[i][el-1] === 0) continue;
arr.push(board[i][el-1])
board[i][el-1] = 0
let tmpArr = arr.slice(arr.length-2, arr.length)
if(tmpArr[0] === tmpArr[1]) {
arr.pop()
arr.pop()
result += 2
}
break;
}
})
return result
}
이 문제는 moves의 길이만큼 과정이 반복되어야하기 때문에 moves.map
을 통해서 반복문을 작성하였다.
for(let i = 0; i < board.length; i++) {
그림처럼 인형은 아래의 바닥에 붙어있기 때문에 그 위의 부분은 빈값을 나타내는 0으로 구성된다. 따라서 0이 아닌 부분까지 찾아 들어가야하기 때문에 board.length
만큼 반복을 진행한다.
if(board[i][el-1] === 0) continue;
위에서부터 값을 확인하는데 0이 나오면 이번 i값의 반복을 끝내고 i가 증가된 다음 반복을 실행한다.
arr.push(board[i][el-1])
board[i][el-1] = 0
반복의 결과 인형이 존재한다면 해당 값을 바구니에 넣어주고, 해당 구역의 값을 0으로 바꿔 인형이 뽑혀져 나갔음을 표시해준다.
let tmpArr = arr.slice(arr.length-2, arr.length)
if(tmpArr[0] === tmpArr[1]) {
arr.pop()
arr.pop()
result += 2
}
break;
뽑혀져 나온 인형들은 바구니의 가장 마지막에 위치하기 때문에 slice
함수를 사용해서 가장 뒤의 값 두 개를 가지고 새로운 배열을 만들어낸다. 이 때 사용하는 인자는 가장 마지막의 두 값이므로 arr.length
를 활용해서 두 값을 뽑아낸다.
새로 만들어진 배열을 가지고 배열의 두 값을 비교하는데 만약 두 값이 같다면 같은 인형이 반복된다는 것을 의미하므로 바구니에서 두 인형을 pop()
을 통해서 제거한 뒤에 제거된 인형의 개수를 세는 변수의 값에 +2를 해준다.
마지막에 break
를 통해서 반복문을 종료해야하는데 만약 break
가 없다면 해당 for문이 board.length
만큼 반복을 하기 때문에 해당 라인의 모든 인형이 뽑혀져 나오는 현상이 발생한다.
따라서 break
를 사용해서 반복문을 끝내주는 것이 필요하다.