[프로그래머스(LV1)] 크레인 인형뽑기 게임

희희희·2022년 1월 9일
0

문제 설명

N x N의 격자 칸이 있다. 각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸이고 모든 인형은 "1 x 1" 크기의 격자 한 칸을 차지하며 격자의 가장 아래 칸부터 쌓여 있다. 게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있는데 집어 올린 인형은 바구니의 가장 아래 칸부터 순서대로 쌓이게 된다.

다음 그림은 [1번, 5번, 3번] 위치에서 순서대로 인형을 집어 올려 바구니에 담은 모습

만약 같은 모양의 인형 두 개가 바구니에 연속해서 쌓이게 되면 두 인형은 터뜨려지면서 바구니에서 사라진다. 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 사라진 인형의 수를 리턴하는 함수를 구현하는 것이 목표이다.


내가 작성한 코드

import Foundation

func solution(_ board:[[Int]], _ moves:[Int]) -> Int {
    var board: [[Int]] = board
    var basket: [Int] = []
    var basketLast: Int?
    var count: Int = 0
    
    for i in moves {
        basketLast = basket.last
        for j in 0...(board.count-1) {
            if board[j][i-1] != 0 {
                basket.append(board[j][i-1])
                board[j][i-1] = 0
                if basket.last == basketLast {
                    basket.removeLast()
                    basket.removeLast()
                    count += 2
                }
                break
            } else {
                continue
            }
        }
    }
    return count
}

먼저 board를 따로 선언해준 이유는 매개변수로 받은 board는 수정될 수 없는데 인형을 뽑게되면 수정해야 하기때문에 var로 새로 선언해주었다.

뽑은 인형이 담기는 basket, 그리고 basket에 같은 인형이 연속으로 들어왔는지 확인하기 위해선 새로운 인형이 들어오기 전의 마지막 요소와 들어온 뒤 마지막 요소를 비교해야 하기 때문에 basketLast를 따로 선언해주었다.

이때 basket이 nil일 수도 있기 때문에 타입을 Int?로 선언해주었다.

moves의 요소들은 column을 의미하지만 1부터 시작하므로 board.count에서 1을 빼주었다.

빈 칸인 경우엔 무시하고 인형이 들어있는 칸의 수를 넣어야 하기 때문에 if문을 이용해서 0이 아닐경우에만 basket에 넣어주도록 하였고, 넣은 수는 원래의 board에서의 값을 0으로 바꿔주었다.

이때 연속으로 같은 값이 두 개인지 확인하였다.

동작이 수행된 뒤 더 진행되지 않게 break를 이용하여 진행중인 반복문을 빠져나와 moves의 다음 요소로 넘어갈 수 있게 하였다.


계속 1단계만 풀고 있는 중인데 조금 더 풀어본 뒤 2단계도 풀어봐야겠다.

profile
iOS 어플 개발 연습

0개의 댓글