https://programmers.co.kr/learn/courses/30/lessons/64061#
문제가 너무 길어서... 문제는 생략!
def solution(board, moves):
stack = [0]
answer = 0
for j in moves:
j=j-1
for i in range(len(board)):
if board[i][j]==0:
continue
else:
if stack[-1] == board[i][j]:
del stack[-1]
answer +=2
board[i][j] = 0
break
else:
stack.append(board[i][j])
board[i][j]=0
break
return answer
전체적인 구조만 살펴본다면
for j in moves:
for i in range(len(board)):
if board[i][j]==0:
continue
else:
if stack[-1] == board[i][j]:
del stack[-1]
break
else:
stack.append(board[i][j])
break
보통 2차원 배열문제는 앞선 for문에서 행에 접근하는 경우가 많은데 이 문제는 앞선 for문에서 열로 접근해야 편한 것 같다. 위 코드에서 몇 가지만 추가하면 문제의 정답을 맞출 수 있다.
for j in moves:
j=j-1
주어진 moves 배열을 for문으로 원소마다 순회한다.
j = j-1로 한 이유는 리스트 인덱싱 할 때 단위가 헷갈려서 0부터 시작하게 바꿔줬다.
for i in range(len(board)):
if board[i][j]==0:
continue
moves for문 안의 중첩된 for문이다.
행에 접근하면서 board[i][j]가 0이라면 비어있는 인형 칸이기 때문에 다음 원소를 찾게 continue를 사용했다.
else:
if stack[-1] == board[i][j]:
del stack[-1]
answer +=2
board[i][j] = 0
break
else:
stack.append(board[i][j])
board[i][j]=0
break
else 에서는 board[i][j] != 0인 원소에 접근하게 된다.
그러면 여기에 다다른 원소는 빈칸이 아니고 실제로 인형이 있는 곳이다!
stack의 마지막과 board[i][j]가 같다면 stack의 마지막에 있는 원소를 제거해주고,
answer에 2를 추가해준다.
(인형이 2개가 사라지는 것이기 때문에 2를 추가..! 계속 answer += 1 했다가 오류 찾는데 오래걸렸다...)
만약 stack[-1] != board[i][j] 라면
stack에 해당 원소를 추가해준다.
2차원 배열에 대한 이해와 stack 자료구조에 대한 이해가 있어야 풀 수 있는 문제로 조금 어려웠당!