반응형
문제
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 |