코드
def solution(board, moves):
basket = [] # 바구니
c = 0 # 터트려져 사라진 인형의 개수
for m in moves:
for i in range(len(board)):
if board[i][m-1] != 0:
print(board[i][m-1])
basket.append(board[i][m-1])
board[i][m-1] = 0
break # 인형을 찾았으면 board 반복 종료
# 바구니에 마지막으로 들어온 두 인형이 같으면 터트리기
if len(basket) > 1 and basket[-2] == basket[-1]:
basket.pop()
basket.pop()
c += 2
return c
문제를 완벽하게 이해했다면 한 번만에 해결할 수 있는 문제이다.
하지만 나는 문제 이해를 하지 못해서 테스트 케이스는 통과하지만 채점 시 모두 오답이 되는 쓰디쓴 경험을 했다.
이 문제에서 키 포인트는 입력으로 주어지는 board를 이해하는 것이라고 생각된다.
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]]
board는 각 가로줄을 나타내는 것이다. 나는 여기서 board의 각 위치에 대한 정보, 즉 세로로 이해했다.
왼쪽 그림은 board를 그대로 나타낸 것이고, 오른쪽 그림은 0을 제외하고 나타낸 것이다.
문제에서 0은 빈칸이라고 알려주었기 때문에 실제 인형 배치는 오른쪽 그림과 같다.
moves에는 board의 몇 번칸으로 가야 하는지에 대한 정보가 주어지므로 이는 board의 [열]에 해당한다.
그럼 어떻게 board에서 m칸에 인형이 있는지 파악할 수 있을까?
board를 0행부터 방문하여 m열의 값을 확인하면 된다. 0이 아니면 인형이 존재하는 것이다.
이 과정을 코드로 나타내면 다음과 같다.
for m in moves:
for i in range(len(board)):
if board[i][m-1] != 0:
print(board[i][m-1])
basket.append(board[i][m-1])
board[i][m-1] = 0
break # 인형을 찾았으면 board 반복 종료
크레인은 위에 있는 인형부터 가져간다. 그러므로 가장 위에 위치한 인형을 찾았으면 break를 한다.
이때 break를 하지 않으면 다음 행에서 인형 찾는 과정을 계속하게 되어 또 인형을 찾기 때문에 i의 반복을 종료해야 한다.
인형을 찾았으면 바구니(bakset)에 추가해 주고 원래 위치인 board[i][m-1]은 빈칸(0)으로 바꿔준다.
# 바구니에 마지막으로 들어온 두 인형이 같으면 터트리기
if len(basket) > 1 and basket[-2] == basket[-1]:
basket.pop()
basket.pop()
c += 2
그다음으로 바구니에서 같은 인형인지 확인한다.
바구니에 2개 이상의 인형이 있어야 비교가 가능하므로 basket의 길이를 확인해 주고 마지막에 담긴 인형[-1]과 그전에 담긴 인형[-2]을 비교하여 같은 값이면(=같은 인형이면) pop() 함수를 사용하여 두 인형을 모두 리스트 basket에서 없애준다.