본문 바로가기
프로그래머스/2단계

(Python/LV2)[1차] 프렌즈4블록

by windy7271 2023. 1. 23.
728x90
반응형

문제출처: 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])
    count = 0
    set_pop = set() # 공통으로 터지는 부분 방지
    while True:
        for x in range(m-1):
            for y in range(n-1):
                now = board[x][y]
                if now == []:
                    continue
                if board[x+1][y] == now and board[x][y+1] == now and board[x+1][y+1] == now: # 정사각형안에 캐릭터들 같을경우
                    set_pop.add((x,y)),set_pop.add((x+1,y)) # set 에 넣어줌
                    set_pop.add((x,y+1)),set_pop.add((x+1,y+1))
        if set_pop: # 겹치는 캐릭터들 제거 / count 추가
            count += len(set_pop)
            for i,j in set_pop:
                board[i][j] = []
            set_pop = set()
        else:
            break

        while True:
            flag = False
            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 = True
            if flag:
                break
    return count
    
    55 / 100

 

def solution(m, n, board):
    for i in range(m):
        board[i] = list(board[i])
    count = 0
    set_pop = set() # 공통으로 터지는 부분 방지
    while True:
        for x in range(m-1):
            for y in range(n-1):
                now = board[x][y]
                if now == []:
                    continue
                if board[x+1][y] == now and board[x][y+1] == now and board[x+1][y+1] == now: # 정사각형안에 캐릭터들 같을경우
                    set_pop.add((x,y)),set_pop.add((x+1,y)) # set 에 넣어줌
                    set_pop.add((x,y+1)),set_pop.add((x+1,y+1))
        if set_pop: # 겹치는 캐릭터들 제거 / count 추가
            count += len(set_pop)
            for i,j in set_pop:
                board[i][j] = []
            set_pop = set()
        else:
            return count

        while True:
            flag = True
            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 = False
            if flag:
                break
    return count
100 / 100

 

set_pop() 을 해주므로 공통된 부분이 터질경우 두개로 카운트되지 않기위해서 set으로 선언

 

이중 포문으로 정사각형으로 터지는 것을 지정해서 set_pop 에 좌표로 넣어준다.

 

now = [] 일때 continue 를 해주지 않으면 무한 루프가 돈다.

if set_pop: # 겹치는 캐릭터들 제거 / count 추가
    count += len(set_pop)
    for i,j in set_pop:
        board[i][j] = []
    set_pop = set()
else:
    return count

터진 부분을 빈 리스트로 바꾸고 set_pop 을 빈 set 으로 다시 선언 다음 while 문 돌때 다시 좌표가 들어가기 때문이다.

겹친 부분이 없으면 더이상 터질부분이 없으므로 종료해주면 된다.

 

    while True:
        flag = True
        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 = False
        if flag:
            break
return count

압축하는 과정.

그 다음게 존재하면 아래꺼를 빈 리스트로 하고 그 다음거를 바꿔주면서 쭊쭊 진행한다.

 

 

반응형

댓글