머신러닝 개발자의 러닝머신

[2018 Kakao Blind Recruitment] 프렌즈 4블록 (Pytho) 본문

알고리즘/프로그래머스

[2018 Kakao Blind Recruitment] 프렌즈 4블록 (Pytho)

oongsong 2022. 8. 10. 20:52
반응형

<문제 유형>

해야할 것 많은 구현

 

<해결 방법>

- 터지는 블록의 크기가 2*2로 정해져 있으므로 bfs나 dfs를 사용하지 않고 board 한번씩 훑으면서 터지는 블록 여부 확인 

1. while 더이상 없을 때까지 (2*2 윈도우 사이즈로 board 검사하면서 터지는 블록 있는지 확인) 

2. 터지는 블록있으면 dic에 좌표 추가해준다. 

3. 맵을 한번 훑은 뒤 board 갱신

     : dic 을 set() 형태로 바꿔주어 중복제거 

     : dic에 있는 좌표들의 board값을 "None"으로 바꿔준다. 

4.  len(dic)만큼 answer 에 더해준다 

5. board 빈칸 채우기 : 아래쪽 행부터 확인하면서 빈칸이 있으면 빈칸이 아닌 칸까지 탐색하여 빈칸이 몇칸인지 num+=  해주고, none이 아닌 값들을 하나씩 빈칸의 갯수 칸 수만큼 내려준다. 이를 마친 뒤 다음 행의 빈칸이 있는지 확인하고 0행이 될때까지 반복해서 한 열당 모든 빈칸을 내려준다. 

    -> 코드 디벨롭, 빈칸의 다음 모든 칸을 내리지말고, 빈칸의 갯수만큼만 none이 아닌 값들을 내리고, 

      그 인덱스부터 다시 시작..


def solution(m, n, board):
    answer = 0

	# 보드 문자 단위로 잘라서 리스트화 
    new = []
    for i in range(m):
        row = list(board[i])
        new.append(row)
    board = new
    
    able = 0
    while able == 0:
        dic = {}
        able = 1
        
        # for문 돌면서 터지는 블록 하나라도 발견되면 able = 0으로 바꾸고 while문 탈출 
        for i in range(m-1, 0, -1):
            for j in range(n-1):
                if board[i][j] == 'None' or board[i][j+1] == 'None' or board[i-1][j] == 'None' or board[i-1][j+1] == 'None':
                    continue

                if board[i][j] == board[i][j+1] and board[i][j+1] == board[i-1][j+1] and board[i-1][j+1]==board[i-1][j]:
                    able = 0
                    if board[i][j] in dic:
                        dic[board[i][j]].append((i, j))
                        dic[board[i][j]].append((i, j+1))
                        dic[board[i][j]].append((i-1, j))
                        dic[board[i][j]].append((i-1, j+1))
                    else:
                        dic[board[i][j]] = [(i, j), (i, j+1), (i-1, j), (i-1, j+1)]
        
         
        if able == 0:
            # 블럭 터트리기
            for key in dic.keys():
                tmp = set(dic[key]) #좌표 중복 제거를 위해 set 타입으로 바꿔줌 
                answer += len(tmp)
                
                dic[key] = list(tmp)
                for x, y in dic[key]:
                    board[x][y] = 'None'
            #아래로 내리기  
            for j in range(n):
                for i in range(m-1, -1, -1):
                    if board[i][j] == 'None':
                        blank = 0
                        for k in range(i-1, -1, -1):
                            if board[k][j] != 'None':
                                break
                            blank += 1
                        
                        num = 0
                        for k in range(i-blank-1, -1, -1):
                            board[i-num][j] = board[k][j]
                            board[k][j] = 'None'
                            num += 1
                        

        # for i in range(m):
        #     print("".join(board[i]))
    
    return answer

 

 

 

 

반응형