크레인 인형뽑기 게임
문제 설명
게임개발자인 죠르디는 크레인 인형뽑기 기계를 모바일 게임으로 만들려고 합니다.
죠르디는 게임의 재미를 높이기 위해 화면 구성과 규칙을 다음과 같이 게임 로직에 반영하려고 합니다.
게임 화면은 1 x 1 크기의 칸들로 이루어진 N x N 크기의 정사각 격자이며 위쪽에는 크레인이 있고 오른쪽에는 바구니가 있습니다.
각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸입니다. 모든 인형은 1 x 1 크기의 격자 한 칸을 차지하며 격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다.
게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있습니다. 집어 올린 인형은 바구니에 쌓이게 되는 데, 이때 바구니의 가장 아래 칸부터 인형이 순서대로 쌓이게 됩니다.
게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.
(그림은 프로그래머스에서 문제를 참고해주세요.)
제한사항
- board 배열은 2차원 배열로 크기는 5 x 5 이상 30 x 30 이하입니다.
- board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
- 0은 빈 칸을 나타냅니다.
- 1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
- moves 배열의 크기는 1 이상 1,000 이하입니다.
- moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.
입출력 예
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]
result : 4
제출 코드
Python
def solution(board, moves):
answer = 0
box = []
board = board[::-1] # 1~5층 순으로 재정렬
matrix = [[] for i in range(len(board))]
for i in range(len(matrix)):
for j in range(len(matrix)):
if board[i][j] == 0:
continue
else :
matrix[j].append(board[i][j])
for i in moves:
if len(matrix[i-1]) == 0: # 현재 열에 인형이 없는경우
continue
else :
doll = matrix[i-1].pop()
if len(box) == 0:
box.append(doll)
else :
if box[-1] == doll:
answer += 2
box.pop()
else:
box.append(doll)
return answer
Swift
func solution(_ board: [[Int]], _ moves: [Int]) -> Int {
var answer: Int = 0
var dollStack: [Int] = []
var matrix = makeMatrix(board)
// 인형 뽑기 loop
for i in 0..<moves.count {
let move = moves[i]
if matrix[move-1].count != 0 {
guard let doll = matrix[move-1].popLast() else {
return 0
}
if dollStack.last == doll {
// 바구니 속 최상단 인형이 현재 뽑은 인형과 동일한 경우
dollStack.removeLast()
answer += 2
} else {
// 동일하지 않은 경우
dollStack.append(doll)
}
}
}
return answer
}
// 열 기준의 matrix 재정렬 함수
func makeMatrix(_ board: [[Int]]) -> [[Int]] {
let BOARD_LEN = board.count
var matrix = [[Int]](repeating: [], count: BOARD_LEN)
for col in 0..<BOARD_LEN {
for row in stride(from: BOARD_LEN-1, to: -1, by: -1) {
if board[col][row] != 0 {
matrix[row].append(board[col][row])
}
}
}
for i in 0..<BOARD_LEN {
matrix[i] = matrix[i].reversed()
}
return matrix
}
문제풀이
본 문제는 2019 카카오 인턴십 문제이며 문제 자체는 어렵지 않았습니다.
파라미터로 전달받는 board
는 행을 기준으로 값이 들어오나 필자는 열 기준이 편하기에 열 기준으로 변경하여 접근하였습니다.
접근하기 편한 2차원 배열 형태로 변경한 이후 크레인 작동 위치가 담긴 배열 moves
를 순회하며 인형 뽑기를 시작합니다.
matrix
의 현재 열에 인형이 하나라도 있다면 배열 내 제일 끝의 있는 원소(구조상 제일 상단에 위치한 인형)을 뽑고 해당 값이 인형 바구니의 최상단에 위치한 값과 동일한지 확인합니다.
만일 동일하다면 두 인형을 터뜨려 answer
에 2를 더해줍니다.
동일하지 않다면 인형 바구니에 현재 뽑은 인형을 push 해줍니다.
moves
를 모두 순회한 이후 터뜨린 인형의 개수 answer
를 반환합니다.
'Algorithm & SQL > Programmers' 카테고리의 다른 글
[Algorithm] [Swift] Programmers - 신규 아이디 추천 (0) | 2021.03.01 |
---|---|
[Algorithm] [Swift] Programmers - 두 개 뽑아서 더하기 (0) | 2021.03.01 |
[Algorithm] [Python&Swift] Programmers - 모의고사 (0) | 2021.03.01 |
[Algorithm] [Python&Swift] Programmers - 네트워크 (0) | 2020.10.05 |
[Algorithm] [Python] Programmers - 키패드 누르기 (0) | 2020.09.11 |