티스토리 뷰
https://programmers.co.kr/learn/courses/30/lessons/64061
코딩테스트 연습 - 크레인 인형뽑기 게임
[[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]] [1,5,3,5,1,2,1,4] 4
programmers.co.kr
<나의 풀이>
def solution(board, moves):
answer = 0
basket = []
for i in moves:
if len(basket) > 1:
if basket[-1] == basket[-2] :
basket.pop()
basket.pop()
answer += 2
for j in range(len(board)-1,-1,-1):
if board[j][i-1] != 0:
basket.append(board[j][i-1])
board[j][i-1] = 0
break
return answer
쉬운 문제였지만 생각보다 오래 걸린 코드😢
로직을 빠르게 만들었지만, 자꾸 실패가 떴다..
계속 실패한 이유는 행과 열을 반대로 적었기 때문이다.
이거 알아내는데 굉장히 시간을 잡아먹었고,
성공 후에는 내가 이렇게 이해력이 낮았나 싶은 자괴감까지 들었다😭
코드 해석
문제에 나온 예시로 설명을 하겠다.
1. 행과 열을 잘 구분하자!
처음 나는 세로 1열에 board[0]이 들어가는 줄 알았다.
알고 보니 board[0]은 맨 위층, 그러니까 크레인의 바로 밑에 부분의 행이 되는 것이었다.
2. 무브에 따라 뽑히는 인형(숫자)을 파악하자!
무브에 따라 뽑히는 인형(숫자)을 적어보면 다음과 같다.
Moves 1 : 4
Moves 5 : 3
Moves 3 : 1
Moves 5 : 1
Moves 1 : 3
Moves 2 : 2
Moves 1 : X ( 앞에서 이미 다 뽑혔기 때문)
Moves 4 : 8
3. 사라지는 인형을 파악하자!
첫 번째 실행 - Moves 1 : 4
두 번째 실행 - Moves 5 : 3
세 번째 실행 - Moves 3 : 1
네 번째 실행 - Moves 5 : 1 👈🏻 같은 것이 2개 나왔으므로 사라짐! (answer +=2 )
첫 번째 실행 - Moves 1 : 4
두 번째 실행 - Moves 5 : 3
다섯 번째 실행 - Moves 1 : 3 👈🏻 같은 것이 2개 나왔으므로 사라짐! (answer +=2 )
첫 번째 실행 - Moves 1 : 4
여섯 번째 실행 - Moves 2 : 2
일곱 번째 실행 - Moves 1 : X
여덟 번째 실행 - Moves 4 : 8
4. 코드로 작성해 보자!
def solution(board, moves):
answer = 0 # 정답 변수
basket = [] # 뽑힌 인형(숫자)을 담을 리스트
# Moves 리스트에 담긴 수 만큼 반복
for i in moves:
# 같은 것이 있다면 사라지게 하는 코드
if len(basket) > 1: # 2개이상이면 동작
if basket[-1] == basket[-2] : # 맨 뒤부터 2개를 가져와 비교
basket.pop() # pop() - 빈 괄호일 시, 맨 뒤부터 요소 삭제
basket.pop()
answer += 2 # 2개가 사라졌으므로 2를 더해준다.
# board의 길이 만큼 반복 (board는 n x n 이라 가로와 세로의 길이가 같음)
for j in range(len(board)):
if board[j][i-1] != 0: # 빈칸(0) 이 아니면 실행
basket.append(board[j][i-1]) # 뽑은 것을 basket에 추가
board[j][i-1] = 0 # 뽑으면 빈칸이 되어야 하므로 0으로 바꿔줌
break # 뽑았으므로 j 반복 종료
return answer
(실행 과정)
<다른 사람의 풀이>
윤응구님 풀이
def solution(board, moves):
cols = list(map(lambda x: list(filter(lambda y: y > 0, x)), zip(*board)))
a, s = 0, [0]
for m in moves:
if len(cols[m - 1]) > 0:
if (d := cols[m - 1].pop(0)) == (l := s.pop()):
a += 2
else:
s.extend([l, d])
return a
'[그 외] > ㄴ (코테연습 : 파이썬 ver)' 카테고리의 다른 글
[프로그래머스] 하샤드 수 (파이썬) (0) | 2021.06.16 |
---|---|
[프로그래머스] 핸드폰 번호 가리기 (파이썬) (0) | 2021.06.16 |
[프로그래머스] 행렬의 덧셈 (파이썬) (0) | 2021.06.16 |
[프로그래머스] x만큼 간격이 있는 n개의 숫자 (파이썬) (0) | 2021.06.16 |
[프로그래머스] 직사각형 별찍기 (파이썬) (0) | 2021.06.16 |
- 설치
- SWiFT
- 코드잇
- 월간 코드 챌린지 시즌2
- 컴퓨터개론
- 문법
- 이진탐색
- 알고리즘
- 월간 코드 챌린지 시즌1
- 프로그래밍언어
- level1
- 프로그래머스문제
- 코딩테스트
- 프로그래머스코딩테스트
- 정렬
- 조합
- 백준
- x만큼간격이있는n개의숫자
- 파이썬
- GIT
- 파이썬문법
- 알고리즘문제
- Summer/Winter Coding(~2018)
- KAKAO
- level2
- 프로그래머스
- 유닉스커맨드
- 피보나치
- 프로그래머스 프로그래머스문제
- 재귀함수
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Total
- Today
- Yesterday