반응형
문제
https://school.programmers.co.kr/learn/courses/30/lessons/17679
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🐍파이썬
더보기
def solution(m, n, board):
for i in range(m):
board[i] = list(board[i])
total = 0
while True:
aset = set()
for i in range(m-1):
for j in range(n-1):
if board[i][j] == '':
continue
if board[i][j] == board[i][j+1] and board[i][j] == board[i+1][j] and board[i+1][j] == board[i+1][j+1]:
aset.add((i, j))
aset.add((i+1, j))
aset.add((i, j+1))
aset.add((i+1, j+1))
if len(aset) == 0: break
#aset에 저장된 좌표들을 모두 공백으로 바꾸기
for i, j in aset:
board[i][j] = ''
#블록 떨어뜨리기
for i in range(m-1):
for j in range(n):
if board[i+1][j] == '':
board[i+1][j] = board[i][j]
board[i][j] = ''
total += len(aset)
return total
정확성: 81.8
합계: 81.8 / 100.0
def solution(m, n, board):
for i in range(m): #문자열 글자 하나씩 리스트에 담기
board[i] = list(board[i])
total = 0 #삭제된 블록 수
while True:
aset = set() #터질 블록의 좌표. set으로 중복처리
for i in range(m-1):
for j in range(n-1):
if board[i][j] == '': #이미 터진 블록일 경우 건너뛰기
continue
#현재 좌표의 오른쪽, 아래, 오른쪽 아래를 확인해서 모두 같으면 aset에 추가
if board[i][j] == board[i][j+1] and board[i][j] == board[i+1][j] and board[i+1][j] == board[i+1][j+1]:
aset.add((i, j))
aset.add((i+1, j))
aset.add((i, j+1))
aset.add((i+1, j+1))
if len(aset) == 0: break #이번 차례에 더 이상 터질 블록이 없다면 while문 종료
#aset에 저장된 좌표들을 모두 공백으로 바꾸기
for i, j in aset:
board[i][j] = ''
#블록 떨어뜨리기
while True:
flag = 0
for i in range(m-1):
for j in range(n):
if board[i][j] and board[i+1][j] == '': #현재 좌표에 블록이 존재하고 다음 좌표가 비어있다면
board[i+1][j] = board[i][j] #다음 좌표에 현재 블록 내리기
board[i][j] = '' #현재 좌표는 비어있게 처리
flag = 1
if flag == 0: break #더 이상 내릴 블록이 없으면 while문 종료
total += len(aset) #이번 차례에 터진 블록의 수를 total에 추가
return total
더보기
블록 떨어뜨리기 부분 while문을 안 써서 계속 실패가 떴다. 다른 블로그를 참고함. 현재 좌표의 아래 좌표에 빈 공간이 여러 개 있을 가능성을 고려해야 한다.
다른 풀이 방법
def solution(m, n, board):
x = board
x2 =[]
for i in x:
x1 = []
for i2 in i:
x1.append(i2)
x2.append(x1)
point = 1
while point != 0:
list = []
point = 0
for i in range(m - 1):
for j in range(n - 1):
if x2[i][j] == x2[i][j + 1] == x2[i + 1][j] == x2[i + 1][j + 1] != '팡!':
list.append([i, j])
point += 1
for i2 in list:
i, j = i2[0], i2[1]
x2[i][j], x2[i][j + 1], x2[i + 1][j], x2[i + 1][j + 1] = '팡!', '팡!', '팡!', '팡!'
for i3 in range(m):
for i in range(m - 1):
for j in range(n):
if x2[i + 1][j] == '팡!':
x2[i + 1][j], x2[i][j] = x2[i][j], '팡!'
cnt = 0
for i in x2:
cnt += i.count('팡!')
return cnt
반응형
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[프로그래머스|파이썬] 숫자 변환하기 (연습문제/lv.2) (0) | 2023.05.27 |
---|---|
[프로그래머스|파이썬] 2 x n 타일링 (연습문제/lv.2) (0) | 2023.05.26 |
[프로그래머스|파이썬] 2개 이하로 다른 비트(월간 코드 챌린지 시즌2/lv.2) (0) | 2023.05.25 |
[프로그래머스|파이썬] 모음사전 (완전탐색/lv.2) (0) | 2023.05.24 |
[프로그래머스|파이썬] 방문 길이 (Summer/Winter Coding(~2018)/lv.2) (0) | 2023.05.23 |
[프로그래머스|파이썬] 바탕화면 정리 (연습문제/lv.1) (0) | 2023.05.23 |