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

[Level 2] 프렌즈 4블록

mhko411 2021. 8. 29. 15:14
728x90

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

 

코딩테스트 연습 - [1차] 프렌즈4블록

프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록". 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙

programmers.co.kr


접근

문제에서 주어진 조건대로 구현하면 되는 문제이다. 따라서 아래와 같은 로직으로 구현하였다.

- 2x2크기로 같은 것이 붙어있는지 확인한다.

- 위의 조건에 부합하는게 있다면 해당 인덱스에 1로 표시한다.

- 1로 표시한 것의 개수를 구하고 1로 표시된 것은 비어있다는 의미로 0으로 표시한다.

- 위의 블록이 아래로 이동하도록 한다.

 

구현

- 위에서 적은 로직을 아래와 같이 코드로 구현하였다.

- check라는 2차원 리스트를 생성하였고 여기에 2x2 블록이 존재했을 때 1로 표시한다.

- 0으로 초기화된 2차원 리스트인 new_board를 생성하고 

- check를 탐색하여 1일 때는 answer만 증가시키고 건너띄고 아닐 때는 board의 값을 new_board에 저장한다.

- 이제 new_board에서 위의 블록들을 아래로 이동시킨다.

    isUpdate = True
    while isUpdate:
        isUpdate = False
        check = [[0 for _ in range(n)] for _ in range(m)]
        for y in range(1, m):
            for x in range(1, n):
                if isPossible(y, x, board):
                    isUpdate = True
                    check = update_check(y, x, check)
        
        new_board = [[0 for _ in range(n)] for _ in range(m)]
        for y in range(m):
            for x in range(n):
                if check[y][x]:
                    answer += 1
                    continue
                new_board[y][x] = board[y][x]
        board = move_board(m, n, new_board)

전체 코드

def isPossible(y, x, board):
    s = board[y][x]
    dy = [0, -1, -1]
    dx = [-1, 0, -1]
    for d in range(3):
        ny = y + dy[d]
        nx = x + dx[d]
        if s != board[ny][nx] or board[ny][nx] == 0:
            return False
    return True

def check_range(y, x, m, n):
    return (0 <= y < m) and (0 <= x < n)

def update_check(y, x, check):
    dy = [0, -1, -1]
    dx = [-1, 0, -1]
    check[y][x] = 1
    for d in range(3):
        ny = y + dy[d]
        nx = x + dx[d]
        check[ny][nx] = 1
    return check

def move_board(m, n, board):
    for x in range(n):
        for y in range(m-1, -1, -1):
            ny = y
            while True:
                ny += 1
                if (not check_range(ny, x, m, n)) or board[ny][x] != 0:
                    ny -= 1
                    break
                
            board[ny][x], board[y][x] = board[y][x], board[ny][x]
    return board
    
def solution(m, n, board):
    answer = 0
    
    isUpdate = True
    while isUpdate:
        isUpdate = False
        check = [[0 for _ in range(n)] for _ in range(m)]
        for y in range(1, m):
            for x in range(1, n):
                if isPossible(y, x, board):
                    isUpdate = True
                    check = update_check(y, x, check)
        
        new_board = [[0 for _ in range(n)] for _ in range(m)]
        for y in range(m):
            for x in range(n):
                if check[y][x]:
                    answer += 1
                    continue
                new_board[y][x] = board[y][x]
        board = move_board(m, n, new_board)
        
        
                    
    return answer

'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글

[Level 2] 메뉴 리뉴얼  (0) 2021.09.02
[Level 2] 오픈채팅방  (0) 2021.08.30
[Level 2] 뉴스 클러스터링  (0) 2021.08.29
[Level 1] 실패율  (0) 2021.08.03
[Level 1] 키패드 누르기  (0) 2021.07.31