문제 설명
위의 게임 화면은 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 배열의 가로 크기 이하인 자연수입니다.
출처 : programmers.co.kr/learn/courses/30/lessons/64061
풀이 방법
아래와 같은 순서로 문제를 풀었다.
-
moves 배열의 원소를 board 배열의 인덱스로 사용해서 0(빈 칸)이 아닌 경우에 basket이라는 배열에 append() 한다. 여기서 값을 하나 찾은 경우에는 board 배열에서 찾은 값은 0으로 치환하고 break를 사용해서 빠져 나간다.
-
위의 방법을 통해 만들어진 basket 배열의 원소들이 basket[i] == basket[i+1]인 경우를 찾아서 pop()을 사용해서 그 값들을 없애고 answer에 2를 더해준다. 여기서 pop()을 사용하면 basket 배열의 길이가 달라지므로 while 문 안에서 처음 basket 배열의 크기와 pop()을 한 이후 basket 배열의 크기를 비교하여 같다면 basket[i] == basket[i+1]인 경우가 없다는 뜻이므로 while문을 break한다.
소스 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
def solution(board, moves):
answer = 0
basket = []
for m in moves:
for b in board:
if b[m-1] != 0:
basket.append(b[m-1])
b[m-1] = 0
break
while True:
before = len(basket)
for i in range(len(basket)-1):
if basket[i] == basket[i+1]:
answer += 2
basket.pop(i)
basket.pop(i)
break
if before == len(basket):
break
return answer
|
cs |
다른 사람들의 풀이를 보니 basket 배열의 basket[-1]인 제일 마지막에 append()된 인형과 basket[-2]인 마지막에서 2번째에 append()된 인형이 같은지를 두번째 for문에서 확인해주고 pop()을 해줬다면 더 간단하게 해결할 수 있다는 것을 알았다. 아래는 basket에 인형을 다 담고 나서 인형을 터트리는 방법이 아닌 인형을 담을 때마다 확인하고 터트리는 방법으로 작성한 코드이다. 문제를 다시 읽어보니 아래의 방법대로 코드를 짜는 것이 맞는 것 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
def solution(board, moves):
answer = 0
basket = []
for m in moves:
for b in board:
if b[m-1] != 0:
basket.append(b[m-1])
b[m-1] = 0
if len(basket) >= 2:
if basket[-1] == basket[-2]:
basket.pop(-1)
basket.pop(-1)
answer += 2
break
return answer
|
cs |
'프로그래머스 공부 > Python' 카테고리의 다른 글
[Level 1 / Python] 실패율(2019 KAKAO BLIND RECRUITMENT) (1) | 2020.11.11 |
---|---|
[Level 1 / Python] 3진법 뒤집기(월간 코드 챌린지 시즌1) (1) | 2020.11.09 |
[Level 1 / Python] 두 개 뽑아서 더하기(월간 코드 챌린지 시즌1) (1) | 2020.11.08 |
[Level 1 / Python] 내적(월간 코드 챌린지 시즌1) (1) | 2020.11.07 |
[Level 1 / Python] 키패드 누르기(2020 카카오 인턴십) (3) | 2020.11.05 |