프렌즈4블록 Pgs#17679

프렌즈4블록 PGs#17679

Python 코드 보기
def scan(m,n,board):
    delPoints = []
    for i in range(m-1):
        for j in range(n-1):
            if board[i][j] == ' ':
                continue
            elif board[i][j] == board [i+1][j+1] and board[i][j] == board[i][j+1] and board[i][j] == board[i+1][j]:
                delPoints.append([i,j,board[i][j]])
    return delPoints

def delBoard(delPoint,board):
    cnt = 0
    for i in range(0,4):
        if board[delPoint[0]+i//2][delPoint[1]+i%2] == delPoint[2]:
            cnt += 1
    board[delPoint[0]] = board[delPoint[0]][0:delPoint[1]] + '  ' + board[delPoint[0]][delPoint[1]+2:]
    board[delPoint[0]+1] = board[delPoint[0]+1][0:delPoint[1]] + '  ' + board[delPoint[0]+1][delPoint[1]+2:]
    return cnt

def pullDown(m, n, board):
    for i in range(m-1,0,-1):
        for j in range(0,n):
            if board[i][j] == ' ':
                target = i-1
                while target > 0:
                    if board[target][j] == ' ':
                        target -= 1
                    else:
                        break
                board[i] = board[i][0:j] + board[target][j] + board[i][j+1:]
                board[target] = board[target][0:j] + ' ' + board[target][j+1:]                
               
def solution(m, n, board):
    answer = 0
    while True:
        delPoints = scan(m,n,board)        
        if delPoints == []:
            break
        for delPoint in delPoints:
            answer += delBoard(delPoint,board)            
        pullDown(m,n,board)
        
    return answer

☝ 입력 형식

  • 입력으로 판의 높이 m, 폭 n과 판의 배치 정보 board가 들어온다. (2 ≦ n, m ≦ 30)
  • board는 길이 n인 문자열 m개의 배열로 주어진다.
  • 블록을 나타내는 문자는 대문자 A에서 Z가 사용된다.

🤞 출력 형식

  • 입력으로 주어진 판 정보를 가지고 몇 개의 블록이 지워질지 출력하라.

🤟 구현 방법

1. 2x2씩 삭제할 블록 검색

  • 해당 블록을 찾기 위해, scan()이라는 함수를 구현하여 사용하였다.
  • 2x2블록의 (0,0)부분, 즉 좌측 상단을 기준점으로 하여 삭제할 점의 좌표와, 언어를 delPoints라는 리스트에 저장하였다.

2. 삭제할 블록 삭제

  • 블록 삭제는 여러번 일어나기 때문에, scan()으로 찾은 delPoints를 각각delBoard()라는 함수에 넣는 방식으로 구현하였다.
  • 삭제되는 영역이 중복 될 수 있기 때문에, 해당 영역이 이미 삭제되어 있는지 아닌지 확인하는 절차가 필요했다.

사실 내가 구현한 방식은 삭제할 때 마다 answer을 올리는 방식은 아니다.

삭제 할 블록의 수를 cnt에 저장하고, 해당 블록의 영역을 ' '로 치환 한 후, answer += cnt로 추가하는 방식이다.

3. 끌어내리기

  • 빈 칸을 찾으면, 위에서 끌어내릴 블록을 찾는 함수 pullDown()을 구현하였다.

댓글남기기