문제
게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.
풀이
def solution(board, moves):
container=[-1]
answer=0
for i in moves:
for j in range(len(board)):
if board[j][i - 1] != 0:
if board[j][i-1]!=container[-1]:
container.append(board[j][i - 1])
board[j][i-1]=0
break
elif board[j][i-1]==container[-1]:
board[j][i - 1] = 0
container.pop()
answer+=2
break
return answer
<1>
def solution(board, moves):
container=[-1]
answer=0
container는 문제에서 '바구니'에 해당하는 리스트이다.
바구니에 담을 때 '이전에 담겨진 인형 값'과 같은 지 확인하기 위한 리스트이다. 따라서 해당 바구니가 정확할 필요는 없고, 이전 값과 비교용으로만 사용된다. 시작은 -1를 넣어주었다. 이유는 -1를 넣지 않는 경우, 리스트 내에 아무 인형도 없을 때 이전값과 비교하려고하면 오류가 발생할 것이기 때문이다.
<2>
for i in moves:
for j in range(len(board)):
moves는 인형 뽑는 기계에 움직이므로 for문을 통해 계속해서 반복되도록 로직을 구성한다.
시뮬레이션 유형 등 문제에서는 moves를 반드시 for문으로 돌려 계획된대로 동작하도록 구성하는 것으로 보인다.
몇 번째 열을 탐색할 지 결정하면 해당 열을 모두 탐색해야하므로 len(board)를 사용하여 모든 행이 탐색되도록 하였다.
<3>
if board[j][i - 1] != 0:
if board[j][i-1]!=container[-1]:
container.append(board[j][i - 1])
board[j][i-1]=0
break
elif board[j][i-1]==container[-1]:
board[j][i - 1] = 0
container.pop()
answer+=2
break
return answer
board[j][i-1]이면 i-1인 열을 고정된 상태에서 해당 열을 탐색하도록 구성된다.
문제에서 0번 index를 사용하지 않으므로 사용 때 -1을 붙여 리스트를 참조할 수 있도록 해야한다.
if board[j][i-1]!=0 보통 무언가가 있거나 없거나 판단할 때 !=을 사용하여 판단한다. 이 때 인형의 존재를 판단하기 위해 사용되었다.
if board[j][i-1]!=container[-1]:
container.append(board[j][i-1])
board[j][i-1]=0
break
container의 맨 마지막 값과 새로 탐색된 인형값이 같지 않다면 container에 넣어 추후에 비교될 수 있게 만들어주고 board는 0으로 처리 해 준다. 또한 해당 열에 대한 탐색은 끝났으므로 break로 for문을 멈춘다.
elif board[j][i-1]==container[-1]:
board[j][i - 1] = 0
container.pop()
answer+=2
break
return answer
container의 맨 마지막 값과 새로 탐색된 인형값이 같다면 2개의 인형이 사라지므로 answer+=2를 사용한다.
container.pop()을 통해 마지막 인형을 빼 준다.
'파이썬 > 파이썬 알고리즘' 카테고리의 다른 글
파이썬 코드업 6029번 6029 : [기초-값변환] 16진 정수 입력받아 8진수로 출력하기(설명)(py) (0) | 2021.04.28 |
---|---|
파이썬 프로그래머스 level 1. 신규 아이디 추천 (0) | 2021.04.28 |
파이썬 백준 1012번 유기농 배추 땅의 모습이 아니라 배추의 위치가 주어지는 문제 - DFS/BFS 풀이 (0) | 2021.04.05 |
파이썬 백준 7562번 나이트의 이동 나이트를 목적지까지 이동시키는 문제 (0) | 2021.04.03 |
파이썬 코드업 6028번 6028 : [기초-출력변환] 10진 정수 입력받아 16진수로 출력하기2(설명)(py) (0) | 2021.04.03 |
댓글