1) 문제 설명
↓ 클릭
2) 코드
('좋아요' 수 제일 많은 풀이)

3) 코드 설명
① stacklist = [ ]
# 인형들을 담아 줄 리스트 변수를 만든다
② answer = 0
# 터져서 없어질 인형의 개수를 계산할 변수를 만들고 0으로 초기화를 한다.
③ 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]]
# 매트릭스는 ↓이게 기본이고 (row, column) 이렇게 나타낸다.

# board를 매트릭스로 출력하면 인덱스 0번째부터 밑으로, 즉↓ 이렇게 된다.

# 그럼 문제로 돌아가서 5 x 5 격자에 board 리스트를 입력하면 결과는 이렇게 된다.
이제 위에서 크레인으로 인형(숫자)을 하나씩 뽑을 거다

④ for move in moves: for i in range(len(board)): if board[i][move-1] != 0: stacklist.append(board[i][move-1]) board[i][move-1] = 0
# moves = [1,5,3,5,1,2,1,4]인데 여기서 하나를 꺼내, 즉 첫번째 1을 꺼내면 move = 1이 되고
len(board) = 5 이므로 range(len(board) 즉, i 는 순차적으로 0, 1, 2, 3, 4 이다.
if board[i][move-1] != 0에서 move = 1 과 i = 0, 1, 2, 3, 4 를 순차적으로 대입하면
board[0][1-1], board[1][1-1], board[2][1-1], board[3][1-1], board[4][1-1]
즉, board[0][0] = 0, board[1][0] = 0, board[2][0] = 0, board[3][0] = 4, board[4][0] = 3 이다.
여기서 "if board[i][move-1] != 0 즉, 값이 0이 아니라면" 이므로 board[3][0] 값인 4를 stacklist에 넣는다.
그 자리(board[3][0])의 값을 0으로 만들어준다.

# 두번째는 move = 5 가 되고, i는 똑같이 0, 1, 2, 3, 4 이므로 board[0][5-1], board[1][5-1]...
board[1][4] = 3 이므로(0이 아니므로) 3을 stacklist에 넣고 그자리를 0으로 만들어 준다.

# 동일한 방법으로 move = 3, move = 5를 하면 stacklist에 1, 1이 들어가고 숫자를 뽑은 자리는 0이 된다.

⑤ if len(stacklist) > 1:
if stacklist[-1] == stacklist[-2]:
stacklist.pop(-1)
stacklist.pop(-1) answer += 2
# stacklist의 길이가 1보다 크다면, 그리고 stacklist의 맨 위에 숫자랑 맨 위에서 두번째 숫자가 같다면,
stacklist[-1] == stacklist[-2], pop을 사용해서 같은 숫자 두개를 터트리고 answer에 터트린 숫자만큼(2개) 더해라.
즉, 위에 보면 stacklist에 4, 3, 1, 1이 들어있고 제일 마지막(제일 위에 2개)에 들어 온 두 숫자 (1하고 1)이
같으므로 터트리고 4, 3이 남는다. 그리고 동일한 방법으로 계속 진행한다.
# 다음에 move = 1 을 하면 staklist에 3이 들어가게 되고 3이 들어간 자리는 0으로 만들어 준다.

# stacklist 바구니를 보니 맨위의 숫자 3, 위에서 두번째 숫자 3이 같으므로, stacklist[-1] == stacklist[-2]
두 숫자를 터트리고 answer에 2개를 더해준다. 그리고 stacklist 바구니에는 4가 남는다.
# 그 다음으로 move = 2를 하면 stacklist 바구니에 board[2][1] 자리에 있는 숫자 2가 들어가고 move = 1을 하면 이미 board[0][0] ~ board[4][0]은 다 0 이므로 뽑을 인형이 없다. 그래서 넘어가고 마지막 move = 4를 하면 stacklist 바구니에 board[3][3] 자리에 있는 숫자 4가 들어간다.

# 우리가 터뜨린 숫자는 4개 이므로 answer를 출력하면 4개가 나오는 것을 확인할 수 있다.

4) 주의점 ( break문 )
# 이 문제를 풀면서 제일 어려웠던 부분은 break 문의 위치였다.
# break의 위치에 따라 결과가 달라지는데 그 부분을 살펴보기로 했다.

# break 문이 마지막 if문 뒤에 붙으면 answer의 결과는 8이다.
# moves 에서 첫번째 요소 1를 꺼내 i에 넣고 j는 range(len(board)) 즉, 0, 1, 2, 3, 4를 순서대로 넣고 위에서 인형(숫자)을 집어올려 stacklist 바구니에 넣는다. 0이 아닌 숫자만 바구니에 넣는 것이므로 stacklist에는
4하고 3이 들어가고 그 자리는 0이 된다


# moves의 두번째 요소 2를 i 넣고 동일하게 계산하면 ↓밑에 처럼 나오고 인형(숫자)를 위에서 부터
집어 올려서 stacklist 바구니에 넣으면 제일 위에 있는 0은 안되고 3이 들어간다. 3이 들어가는 즉시
맨위의 숫자 3과 맨위에서 두번째 숫자 3이 같으므로 터트려져 버린다.

answer = 2
# 여기서 break 문이 걸리고 끝이나고 for문으로 다시 돌아가서 moves의 그 다음 요소를 넣고 계산한다.
# if len(stacklist) > 1:
if stacklist[-1] == stacklist[-2] :
stacklist.pop(-1)
stacklist.pop(-1)
answer += 2
break
이므로 2번 pop 해서 3이 터트려지고 answer에 2개 더해졌으니 break 되고 다시 for문으로 돌아가게 되는거다. stacklist 바구니에 숫자 3만 들어갔으니 그 자리만 0으로 바뀌게 된다.

# moves의 세번째 요소 3을 i에 넣고 동일하게 계산하면 ↓처럼 나오고 위에서부터 인형(숫자)를 집어올려
1, 5, 4, 1 순서대로 stacklist 바구니에 집어 넣는다. 그리고 그 자리는 0으로 바뀌게 된다.


# moves의 네번째 요소 5를 i에 넣고 동일하게 계산하면 ↓처럼 나오고 위에서부터 인형(숫자)를 집어올려
1, 2, 1 순서대로 stacklist 바구니에 집어 넣으면 되는데 1을 넣으면 stacklist[-1] 숫자 1이랑 stacklist[-2]
숫자 1이 같으므로 터트려진다.
터트려지면서 answer에 2개 더해지고 break 문을 만나 다시 for문으로 돌아간다. 그리고 숫자 1의 자리는
0으로 바뀐다.

answer = 4

# moves의 다섯번째 요소 1를 i에 넣고 계산하면 ↓처럼 나오는데 그림과 같이 이미 모든 값이 0으로 바뀌었 으므로 아무런 작업없이 for 문으로 돌아간다.

# moves의 여섯번째 요소 2를 i에 넣고 동일하게 계산하면 ↓처럼 나오고 위에서부터 인형(숫자)를 집어올려 2, 2, 5 순서대로 stacklist 바구니에 집어 넣으면 되는데 2 넣고 2를 넣으면 stacklist[-1] == stacklist[-2]
이므로 2가 터트려진 터트려지면서 answer에 2개 더해지고 break 문을 만나서 다시 for문으로 돌아간다.
숫자 2의 자리는 0으로 바뀐다.

answer = 6

# moves의 일곱번째 요소 1를 i에 넣고 계산하면 아까와 같이 이미 모든 값이 0으로 바뀌었으므로 아무 작업도 없이 for문으로 돌아가서 마지막 요소 4를 i에 넣고 동일하게 계산한다. 위에서부터 인형(숫자)를 집어올려 4, 3 순서대로 stacklist 바구니에 집어 넣으면 되는데 4를 넣으면 stacklist[-1] == stacklist[-2] 이므로 4가 터트려진다. 터트려지면서 answer에 2개 더해지고 break 문을 만나고 for 문이 다 돌았으므로 if문에서 나온다. 그리고 숫자 4의 자리는 0으로 바뀐다.

answer = 8
# break 문이 마지막 if 문에 걸리면 이러한 과정을 거쳐서 answer = 8 이 된다.
'코딩 연습' 카테고리의 다른 글
[프로그래머스] 체육복 (python) (0) | 2022.05.10 |
---|---|
[카카오] 1차 다트 게임 (python) (0) | 2022.05.04 |
[프로그래머스] 내적 (python) (0) | 2022.04.28 |
[프로그래머스] 로또의 최고 순위와 최저 순위 (python) (0) | 2022.04.28 |
[카카오] 신고 결과 받기(python) (0) | 2022.04.18 |