코딩테스트 연습 - [1차] 프렌즈4블록 | 프로그래머스 (programmers.co.kr)

 

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

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

programmers.co.kr

 

풀이)

접근)

2x2형태의 블록들을 제거하면서 점수를 얻는게임인데 한 턴마다 조건에 해당되는 블록들이 사라지고 재구성된다.

이를 편하게 구현하기 위해 반복되는 구조를 모듈화 하였다.

조건에 해당되는 블록들을 리스트에 담고 제거시키는 deleteBlock(), 제거된 블록들을 판단하여 보드를 재구성해주는 updateBoard로 구성된다.

알고리즘)

  • 조건에 해당하는 블록을 판단하기 위해 맨 아래 행과 맨 오른쪽 열을 제외하고 탐색한다.
  • 블록의 옆 아래 ,옆에 아래가 현 블록과 모두 같다면 모든 블록을 리스트에 추가한다.
  • 이런식으로 반복하는데 겹치는 블록은 리스트에 다시 넣지 않는다.
  • 탐색이 끝나면 리스트에 담겨 있는 블록들의 좌표를 이용하여 'X'표시를 한다.
  • updateBoard를 이용하여 보드를 재구성하는데 방법은 다음과 같다     
  • 마지막 전 행까지 탐색하는데 탐색을 하다가 현 위치가 'X'표시가 아닌데 아래 블록이 'X'표시라면 교체한다.        (이 때 가장 아래의 X표시와 교체한다.)
  • 블록을 제거할 때에 카운팅한 count변수를 리턴한다.
  • 리턴값이 0일 때까지 반복

코드)

def deleteBlock(m,n,board):
    count = 0
    lst = []
    for r in range(m-1):
        for c in range(n-1):
            if board[r][c] == 'X':
                continue
            if  (board[r][c] == board[r][c+1] 
                and board[r][c] == board[r+1][c+1]
                and board[r][c] == board[r+1][c]):
                if ([r,c] not in lst ):  lst.append([r,c])
                if ([r,c+1] not in lst ):  lst.append([r,c+1])
                if ([r+1,c+1] not in lst):  lst.append([r+1,c+1])
                if ([r+1,c] not in lst):  lst.append([r+1,c])
                
                
    for r,c in lst:
        board[r][c] = 'X'
        count +=1
    updateBoard(board,m,n)
    return count
                
def updateBoard(board,m,n):
    for r in reversed(range(0,m-1)): #마지막 전 행까지(0 ~ 4)
        for c in range(n):
            if board[r][c] !='X':
                change = -1
                for i in range(r + 1,m): #마지막 행까지(0 ~ 5)
                    if board[i][c] == 'X':
                        change = i
                if change > -1:
                    board[change][c] = board[r][c]
                    board[r][c] = 'X'
                
    

def solution(m, n, board):
    answer = 0
    row_list = list(board)
    lst = []
    for row in row_list:
        r_lst = []
        for value in row:
            r_lst.append(value)
        lst.append(r_lst)

    while True:
        b = deleteBlock(m,n,lst)
        if b == 0:
            break
        answer += b

    return answer

'프로그래머스' 카테고리의 다른 글

모음사전  (0) 2021.11.24
삼각 달팽이  (0) 2021.11.08
더 맵게  (0) 2021.10.31
짝지어 제거하기  (0) 2021.10.31
괄호 변환  (0) 2021.10.31

+ Recent posts