본문 바로가기

취업을 준비하며 정리하는 컴퓨터 지식/Problem Solving

[Problem Solving] 프로그래머스 17679 프렌즈 4블록

728x90

프렌즈 4블록 문제 설명은 다음 링크를 참고해주시기 바랍니다. 문제 설명

 

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

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

programmers.co.kr

 

프렌즈 4블록은 2 x 2 형태의 패턴을 말하는 것으로 블록이 주어지면 해당 패턴을 찾아 사라지게 합니다. 이때, 블록 1개 당 1점으로 점수를 계산하여 총 얻은 점수를 결과로 반환하는 문제입니다.

 

블록을 사라지게 한 후에는 블록들은 아래로 떨어지게 되어 빈 공간을 채워줘야 합니다. 다음은 문제 해결 순서입니다.

 

  1. board를 순환하며 2 x 2 패턴을 찾아 삭제해야할 블록들의 좌표를 저장한다.
    • 좌표가 중복될 수 있기 때문에 좌표 저장은 집합을 사용하여 저장한다.
  2. answer에 1의 결과의 개수만큼 더해준다.
  3. 1의 결과를 순환하며 board의 값을 '0'으로 바꿔 사라지게 해준다.
  4. 블록을 아래로 떨어뜨려 빈 공간을 채워준다.
  5. 1을 반복한다.

다음은 문제 해결 순서를 기반으로 작성한 코드입니다.

 

def destroy_block_list(m,n,board):
  destroy = set()
  for x in range(m-1):
    for y in range(n-1):
      if board[x][y] == board[x+1][y] == board[x][y+1] == board[x+1][y+1] and board[x][y] != '0':
        destroy.add((x,y))
        destroy.add((x+1,y))
        destroy.add((x,y+1))
        destroy.add((x+1,y+1))
  return destroy

def falling_board(m,n,board):
  is_invalid = True
  while is_invalid:
    is_invalid = False
    for x in range(m-1):
      for y in range(n):
        if board[x+1][y] == '0' and board[x][y] != '0':
          is_invalid = True
          board[x][y], board[x+1][y] = '0', board[x][y]
  return board

def solution(m, n, board):
  answer = 0
  board = [list(item) for item in board]
  destroy_list = destroy_block_list(m,n,board)

  while destroy_list:
    answer += len(destroy_list)

    for x, y in destroy_list:
      board[x][y] = '0'
    board = falling_board(m, n, board)
    destroy_list = destroy_block_list(m,n,board)
  return answer

 

코드를 제출했을 때 테스트 케이스 5, 10번이 실패를 하였습니다. 이유를 확인하기 위해 print(board)를 사용하여 board의 값들을 확인해보았더니 블록들이 빈공간을 제대로 채워주지 않았다는 것을 확인할 수 있었습니다.

 

따라서 while문, is_invalid 변수를 추가하여 board에서 모든 빈 공간이 제대로 채워지도록 반영하는 것으로 문제를 해결하였습니다.

 

728x90