알고리즘/프로그래머스문제풀이

[Python/프로그래머스]프렌즈4블록_구현

개발자 덕구🐾 2022. 10. 12. 14:48
728x90

 

https://school.programmers.co.kr/learn/courses/30/lessons/17679

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

🐾 2022-10-21

 

문제를 보고 생각난 풀이 : 

 

모든 영역을 돌면서 해당 블록을 기준으로 우,하,아래우측 대각선 블록이 동일한 블록을 찾는다.

모든 영역을 돌면서 찾은 다음에 모은 블럭들을 비었다는 표시를 해준다.

그 후 비었다는 표시를 이용해 위에서 아래로 값들을 내린다. 

이것을 계속 반복하면서 동일한 블록이 없을 때까지 찾는다.

반복이 멈추면 다시 돌면서 빈 블록의 개수를 세서 반환하면 된다. 

 

 

 

방법은 맞는 것같은데 위에서 아래로 내리는 방법을 잊어먹었다..

아마 백준 2048에서 비슷하게 한것같은데 생각이 안나네..?😈

 

 

 

 

정답 코드 : 

def solution(m, n, board):
    for i in range(m) : board[i] = list(board[i])
    
    cnt = 0
    rm = set()
    while True : 
        for i in range(m-1) :
            for j in range(n-1) :
                t = board[i][j]
                if t == [] : continue 
                if t == board[i][j+1] and t == board[i+1][j] and t == board[i+1][j+1]  :
                    rm.add((i,j+1));rm.add((i+1,j))
                    rm.add((i+1,j+1));rm.add((i,j))
        if rm : 
            cnt += len(rm)
            for i,j in rm :
                board[i][j] = []
            rm = set()
        else : return cnt 
    
        while True :
            moved = 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] = []
                        moved = 1 
            if moved == 0 : break

 

 

주의해야할 점은

1. board가 문자열의 일차원 배열으로 들어오기 때문에 이차원 배열으로 바꿔줘야한다.

2. set에 추가하는 건 리스트 형태는 안되고 튜플 형태로 해야한다.

3. 두 문장을 한줄에 하고 싶으면 중간에 ';'를 붙여줘야한다. 

 

 

 

 


 

 

 

 

 

복습하면서 만든 코드 : 

def solution(m, n, board):
    ans = 0
    for i in range(m) :
        board[i] = list(board[i])
    while True : 
        candi = 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][j] == board[i+1][j+1] :
                    candi.add((i,j))
                    candi.add((i+1,j))
                    candi.add((i,j+1))
                    candi.add((i+1,j+1))
        if not candi : return ans 
        ans += len(candi)
        for i,j in candi :
            board[i][j] = []
        
        # 밑으로 내리기 
        while True :
            ismove = False
            for i in range(m-1) :
                for j in range(n) :
                    if board[i+1][j]==[]and board[i][j] :
                        ismove = 1
                        board[i+1][j] = board[i][j]
                        board[i][j] = []
            if not ismove : break

 

 

 

이 한줄을 추가 안해서 틀렸었다!!

if board[i][j] == [] : continue

 

 

 

 

 

 

 

 

 

 

 

 

참고 블로그 : 

https://my-coding-notes.tistory.com/226

 

[프로그래머스 / 파이썬] 프렌즈4블록 (2018 KAKAO BLIND RECRUITMENT)

코딩테스트 연습 - [1차] 프렌즈4블록 프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록". 같은 모양의 카카

my-coding-notes.tistory.com

 

 

 

반응형