데이터사이언스 기록기📚

[프로그래머스/Python] Level 2_[1차] 프렌즈4블록 (2018 KAKAO BLIND RECRUITMENT) 본문

Coding Test/프로그래머스(Python)

[프로그래머스/Python] Level 2_[1차] 프렌즈4블록 (2018 KAKAO BLIND RECRUITMENT)

syunze 2023. 10. 26. 20:46

📌문제 유형

2018 KAKAO BLIND RECRUITMENT

 

📌문제

 

프로그래머스

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

programmers.co.kr

 

📌나의 문제풀이

- dfs 함수에서 4개가 같은 블록인지 확인 -> 같은 블록인 경우, 좌표 넣기

- 같은 블록이 터지면, 남아있는 블록 내리기

def dfs(x,y,m,n,new_board):
    dx = [0,1,1]
    dy = [1,0,1]
    flag = 0
    
    for k in range(3):
        nx = x + dx[k]
        ny = y + dy[k]
        if 0 <= nx < m and 0 <= ny < n:
            if new_board[x][y] == new_board[nx][ny]:
                continue
            else:
                flag = 1
                break
        else:
            flag = 1
            break
            
    if flag == 0:
        return [(x,y), (x+1,y), (x,y+1), (x+1,y+1)]
    else:
        return []
    

def solution(m, n, board):
    answer = 0
    new_board = []
    for k in range(len(board)):
        new_board.append(list(board[k]))
    
    while True:
        list_ = []
        for i in range(len(new_board)):
            for j in range(len(new_board[0])):
                if new_board[i][j] != '.':
                    check = dfs(i,j,m,n,new_board)
                    if check != []:
                        list_.extend(check)
        list_ = list(set(list_))
        if len(list_) == 0:
            break
        else:
            answer += len(list_)

        for a,b in list_:
            new_board[a][b] = ''

        # 돌려서 지우기
        new_board = list(zip(*new_board))
        new = []
        for l in range(len(new_board)):
            tmp = []
            for t in range(len(new_board[l])):
                if new_board[l][t] != '':
                    tmp.append(new_board[l][t])
            tmp_n = ['.' for _ in range(len(new_board[l]) - len(tmp))]
            tmp_n.extend(tmp)
            new.append(tmp_n)

        new_board = list(map(list,zip(*new)))
        
    return answer

 

📌다른 사람의 문제풀이

def pang(m, n, board):
    t_board = []
    for x in range(m):
        t_board.append([])
        for y in range(n):
            t_board[x].append(board[x][y])

    flag = False
    for x in range(m-1):
        for y in range(n-1):
            if len(set([board[x][y], board[x][y+1], board[x+1][y], board[x+1][y+1]])) == 1:
                if board[x][y] != '0':
                    flag = True
                    t_board[x][y] = '0'
                    t_board[x][y+1] = '0'
                    t_board[x+1][y] = '0'
                    t_board[x+1][y+1] = '0'

    return flag, t_board


def restruct(m, n, board):
    re_board = [''] * m
    for x in range(n):
        ys = ''.join([board[y][x] for y in range(m)]).replace('0','').zfill(m)
        for y in range(m):
            re_board[y] += ys[y]

    return re_board


def get_num(m, n, board):
    cnt = 0
    for x in range(m):
        for y in range(n):
            if board[x][y] == '0':
                cnt += 1
    return cnt

def solution(m, n, board):
    flag = True
    while flag:
        flag, board = pang(m, n, board)
        board = restruct(m, n, board)

    return get_num(m, n, board)

 

📌리뷰

- 행렬 돌리기 : board = list(map(list,zip(*new)))

728x90
Comments