크레인 인형뽑기 게임(level1)

원용현·2022년 8월 16일
0

프로그래머스

목록 보기
1/49

링크

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 를 사용해서 반복문을 끝내주는 것이 필요하다.

0개의 댓글