본문 바로가기
Problem Solving/프로그래머스

[프로그래머스|파이썬] [1차] 프렌즈4블록 (2018 KAKAO BLIND RECRUITMENT/lv.2)

by 청량리 물냉면 2023. 5. 24.
반응형
문제

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

 

반응형