전에도 한 번 풀어봐서 힘들게 이해했었는데,
다시 푸는 것임에도 못풀었다..
다른 사람들의 코드를 많이.. 아니 다 참고했는데, 한 줄 씩 print찍어보면서 겨우 이해했당
def solution(board, moves):
basket = [] # 인형을 담아줄 바구니
answer = 0 # 인형 터진 개수
for idx in moves: #열
for jdx in range(len(board)): # 행
if board[jdx][idx-1]!=0:
basket.append(board[jdx][idx-1])
board[jdx][idx-1]=0
if len(basket)>1:
if basket[-1]==basket[-2]:
del basket[-1]
del basket[-1]
answer+=2
break
return answer
먼저 idx는 moves에 주어진 열값을 의미한다.
그리고 jdx는 board의 리스트 길이로 행 수를 의미한다.
보통 리스트를 사용할 때 내 상식에서는 "list[행][열]이야"라고 외워버려서 [열][행]으로 구분된 for문에서 잠시 혼동이 왔었다.
idx로 열값이 주어지면, for문 board의 n*n의 n값(즉 5개)를 반복하는 것이다.
board[행][열]이므로 board[jdx][idx-1]로 목표 위치를 정한다.
열값은 1,2,3,4,5로 열을 나타내므로 0부터 시작하는 컴퓨터에선 idx-1을 해줘야 한다.
그러고 board[jdx][idx-1]에서 0이 아닌 값이 나오면
basket 리스트에 추가해준다. 그 이후 board[jdx][idx-1]은 초기화 0 으로 변경해주었다. (basket으로 해당 값이 옮겨 갔으니까)
새로운 basket이 채워지면 즉 1이상이면,
basket의 마지막 들어온 값과 마지막에서 두번째로 들어온 값의 중복 검사를 한다.
나는 초반에 바보같이 del basket[-1] del basket[-2] 하고 왜 안돼! 이러고 있었는데,(바보..)
마지막의 두 값을 삭제해주면 되므로 del basket[-1]을 두번 반복하고
answer 카운트 값을 2회 올려주었다.
이 과정이 끝나면 " 같은 열"에서 0이 아닌 숫자를 찾지 않도록 break를 써서 board를 탐색하는 반복문을 빠져나가 다음 moves의 값을 뽑아 올 수 있다.
분명 이런 문제가 많이 나올 것이고 익숙해져야할 것 같다..
또 봐도 까먹을 것 같긴하담..
'Algorithm > 연습' 카테고리의 다른 글
[프로그래머스] LEVEL - 1 소수 만들기 (0) | 2021.12.21 |
---|---|
[프로그래머스] LEVEL-1 없는 숫자 더하기 (0) | 2021.12.18 |
[프로그래머스] LEVEL1 - 키패드 누르기 (0) | 2021.12.17 |
[프로그래머스] LEVEL1 - 숫자 문자열과 영단어 (0) | 2021.12.17 |
[프로그래머스] LEVEL1 - 신규 아이디 추천 (0) | 2021.12.16 |