티스토리 뷰
https://programmers.co.kr/learn/courses/30/lessons/17679?language=python3
애니팡처럼 2x2 같은 모양의 캐릭터가 있으면 블록을 지우는 게임 입니다.
알고리즘은 다음과 같습니다.
- 모양이 같은 블록을 지우고 위에 있던 블록들이 아래로 떨어져야 하는데 이부분을 구현하기 위해서는 리스트를 회전 시켜 주는게 좋습니다.
list(map(list,zip(*board)))
코드를 쓰면 리스트를 회전시킨것처럼 만들 수 있습니다. - 블록을 하나씩 순회하며 옆, 아래, 대각선 방향이 같은지 확인하고, 같으면 좌표를 set에 넣어서 좌표가 중복되지 않게 보관합니다.
|
연산자는 set에서 합집합을 의미합니다. - set에 있는 좌표들에 '0' 을 찍어서 지운 블록들을 표시합니다.
- 지운 블록의 수만큼 '_' 블록을 리스트에 추가 해주고 뒤에 기존에 남아있던 블록들을 순서대로 붙입니다. 이렇게 하면 남은 블록들이 아래로 떨어지는 효과가 있습니다. 여기서 1번에서 리스트를 회전 시킨 이유가 나왔습니다. 회전을 시키지않는다면 블록들을 붙이기가 어려웠을 것입니다.
- 찾은 좌표들을 메인함수에 반환하여 answer에 더하고 찾은 좌표가 없을때까지 다시 반복합니다.
def find_pop(m, n, board):
find_set = set()
for y in range(n-1):
for x in range(m-1):
if (board[y][x] == board[y][x+1] ==
board[y+1][x] == board[y+1][x+1] != '_'):
find_set |= set([(y,x),(y,x+1),(y+1,x),(y+1,x+1)]) # 2
for y, x in find_set:
board[y][x] = '0' # 3
for y in range(n):
board[y] = (['_' for i in range(board[y].count('0'))]
+ [z for z in board[y] if z != '0']) # 4
return len(find_set) # 5
def solution(m, n, board):
answer = 0
b = list(map(list,zip(*board))) # 1
while True:
x = find_pop(m,n,b)
if x == 0:
return answer
else:
answer += x
'ALGORITHM > Programmers' 카테고리의 다른 글
[프로그래머스] 정수 삼각형.py (0) | 2022.01.09 |
---|---|
프로그래머스 큰 수 만들기.py (0) | 2021.12.05 |
[프로그래머스] N개의 최소공배수.go (0) | 2021.11.01 |
[프로그래머스] 게임 맵 최단거리.py (0) | 2021.06.06 |
[ 파이썬 ] 서울에서 김서방 찾기 (0) | 2020.05.01 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- taggit
- 백준
- 의대 신경학 강의
- dfs
- 방금그곡
- for-else
- django
- 독후감
- query
- Python
- ManyToMany
- 소프트웨어 장인
- go
- Two Scoops of Django
- leetcode
- 팰린드롬수
- go context
- 파이썬
- gunicorn
- 문자열 뒤집기
- stdout
- conTeXt
- 프로그래머스
- sql lite
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
글 보관함