프랜즈4블록

메캉·2022년 7월 26일
0

알고리즘 👑

목록 보기
9/11

URL

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

개선할 점

  1. set은 append가 아닌 add를 사용한다
  2. 이차원 배열 초기화 및 이차원 배열 사용법 익히기
  3. global M, N을 둘 필요가 없다
  4. zfill : 문자열 앞에 0을 채운다 → list.insert(index, value)
  5. list[m][n]에서 i,j 리스트를 지울때, 인덱스로 지우면 꼬일 수 있다
    : 큰 인덱스 부터 지우는 방법 있음
  6. set을 만들어서 해당 index를 저장했었는데, 그냥 tmp_list를 만들어서 그 안에 저장해도 되었다...

나의 코드

M=0
N=0

def deleteBlocks(board, set_res):
    set_res = list(set_res)
    for s in set_res:
        board[s[0]][s[1]] = 'o'


    for i in range(N):
        board[i] = list(filter(lambda x : x != 'o',board[i]))


    for i in range(N):
        while len(board[i]) < M:            
            board[i].insert(0, 'o')

    return board

def findBlocks(board):
    res = set()
    for i in range(N-1):
        for j in range(M-1):
            flag = board[i][j]
            if flag != 'o' and flag == board[i+1][j] and flag == board[i][j+1] and flag == board[i+1][j+1]:
                res.add((i,j))
                res.add((i+1,j))
                res.add((i,j+1))
                res.add((i+1,j+1))
    return res


def solution(m, n, board):
    answer = 0
    global M
    global N
    M = m
    N = n
    board = [[board[i][j] for i in range(m)] for j in range(n)]
    set_res = findBlocks(board)

    answer += len(set_res) # set 결과 return
    while len(set_res) != 0:
        ### delete blocks
        board = deleteBlocks(board, set_res)

        ### update board
        set_res = findBlocks(board)
        answer += len(set_res)

    # print(board)
    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)

0개의 댓글