프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
아이디어
1. 입력값 구조 바꾸기
처음에 맵은 행단위로 들어옵니다. [1행,2행,3행 ... ]
블록이 사라진 빈칸을 채울때 열단위로 떨어지기 때문에 열단위로 형태를 바꿔주었습니다. [1열,2열,3열 ...]
이때 상부에서 하부로 블록이 떨어지기 때문에 하단부를 인덱스 0으로 설정해주었습니다.
단순하게 말하면 입력을 시계방향으로 90도 돌려주었습니다.
2. 같은 모양 삭제하고 아래로 밀기
구체적인 구현 과정은 다음과 같습니다.
1) 4개가 똑같은 경우 좌상단의 좌표들을 저장 (한꺼번에 뿅 사라져야하므로 이 순회를 돌면서 삭제하면 안됨. 여기서는 확인만 함.)
2) 삭제할 내용물 '-' 로 변경. 변경할때 cnt 올리기
3) 새로운 맵배열을 만들고 '-' 가 아닌 내용물만 새로운 맵배열에 아래서부터 차곡차곡 복붙시킴
3. 맵에 변경사항이 없을 때까지 반복
코드
def solution(m, n, board):
# 1.
nboard = [list(reversed([board[r][c] for r in range(m)])) for c in range(n)]
# 2.
def pop_and_fill(m,n,nboard) :
pops = []
for r in range(m-1) :
for c in range(n-1) :
if nboard[c][r] == nboard[c+1][r] == nboard[c][r+1] == nboard[c+1][r+1] != '-' :
pops.append((r,c))
cnt = 0
D = [(0,0),(1,0),(0,1),(1,1)]
for r,c in pops :
for dc, dr in D :
if nboard[c+dc][r+dr] != '-' :
cnt+=1
nboard[c+dc][r+dr] = '-'
nnboard = [['-' for _ in range(m)] for _ in range(n)]
for c in range(n) :
i = 0
for r in range(m) :
if nboard[c][r] != '-' :
nnboard[c][i] = nboard[c][r]
i+=1
return nnboard, cnt
# 3.
answer = 0
while True :
nboard,cnt = pop_and_fill(m,n,nboard)
answer+=cnt
if cnt == 0 :
break
return answer
'Algorithem > 프로그래머스 PS with code' 카테고리의 다른 글
프로그래머스 MySQL : [lv.4] 저자 별 카테고리 별 매출액 집계하기 (0) | 2023.07.29 |
---|---|
프로그래머스 MySQL : [lv.1] 자동차 대여 기록에서 장기/단기 대여 구분하기 (0) | 2023.07.20 |
[python] [3차] 파일명 정렬 lv.2 (0) | 2023.06.24 |
[python3] 퍼즐 조각 채우기 lv.3 : 구현 (0) | 2023.06.24 |
[python3] 괄호 회전하기 lv.2 (0) | 2023.01.26 |