문제
https://school.programmers.co.kr/learn/courses/30/lessons/17679
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
내 풀이
board의 내부의 자료형이 문자열이므로 리스트로 바꾸었다.
board 전체를 돌면서 2x2의 블록이 동일한 경우를 찾고, 제거해야 할 블록을 담는 리스트인 rm에 담았다.
rm 안에는 중복이 있을 수 있으므로 set으로 변환하여 길이를 구하고 answer에 추가하였다. 만약, set으로 변환된 rm의 길이가 0이면 더 이상 제거할 블록이 없다는 뜻이므로 하던 동작을 중단하면 된다.
rm을 다 만들었으면, rm을 참고하여 제거해야 할 블록들을 전부 '#'으로 만들었다. '#'은 빈 공간을 뜻하게 된다.
마지막으로 빈 공간보다 위에 있는 블록들을 아래로 내려준다. tmp를 이용하여 간단하게 조작하였다.
def solution(m, n, board):
answer = 0
board = [list(x) for x in board]
while True:
rm = []
for i in range(len(board)):
for j in range(len(board[0])):
if i+1 < len(board) and j+1 < len(board[0]) and board[i][j] != '#' and board[i][j] == board[i+1][j] and board[i][j] == board[i][j+1] and board[i][j] == board[i+1][j+1]:
rm.extend([(i, j), (i+1, j), (i, j+1), (i+1, j+1)])
if not len(set(rm)): break
answer += len(set(rm))
for r in rm:
board[r[0]][r[1]] = '#'
for j in range(len(board[0])):
tmp = []
for i in range(len(board)):
if board[i][j] != '#': tmp.append(board[i][j])
if len(tmp) < len(board[0]):
tmp = ['#']*(len(board) - len(tmp)) + tmp
for i in range(len(board)):
board[i][j] = tmp[i]
return answer
총평
다른 풀이 중에 map을 사용해서 board의 자료형을 바꾼 것이 있었다. map의 사용법도 좀 익혀 놓아야겠다고 생각했다.
'알고리즘 > 카카오 EASY' 카테고리의 다른 글
비밀지도 (Level 1) (0) | 2022.07.11 |
---|---|
캐시 (Level 2) (0) | 2022.07.08 |
후보키 (Level 2) (0) | 2022.07.07 |
순위 검색 (Level 2) (0) | 2022.07.05 |
튜플 (Level 2) (0) | 2022.07.04 |