프로그래머스/코딩테스트 Lv. 2
[1차] 프렌즈4블록 - Python(2018 KAKAO BLIND RECRUITMENT)
아몬드바
2023. 10. 12. 22:49
728x90
문제 설명
프렌즈4블록
블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록".
같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임이다.
입력으로 블록의 첫 배치가 주어졌을 때, 지워지는 블록은 모두 몇 개인지 판단하는 프로그램을 제작하라.
입력 형식
입력으로 판의 높이 m, 폭 n과 판의 배치 정보 board가 들어온다.
2 ≦ n, m ≦ 30
board는 길이 n인 문자열 m개의 배열로 주어진다. 블록을 나타내는 문자는 대문자 A에서 Z가 사용된다.
출력 형식
입력으로 주어진 판 정보를 가지고 몇 개의 블록이 지워질지 출력하라.
입출력 예제
문제해결과정
1. 먼저 같은블럭 4개를 찾는것은 생각보다 쉬웠지만 블럭을 아래로 떨어뜨린다는것에 대해 너무 어렵게 느껴졌다..
2. 처음에는 루프한번 수행 시 제거하고 난 다음 배열에서 맨위 블럭이랑 현재 남아있는 블럭에 대해서 swap 하려고 했는데 빈공간이 생기면서 자꾸 에러가 났다.
3. 결국 힌트보고 함..하
def solution(m, n, board):
# m 은 판의 높이, 폭 n
board = [list(i) for i in board]
answer = 0
# 중복제거 방지 set 사용
clear = set()
while True:
for i in range(m - 1):
for j in range(n - 1):
# 자신, 오른쪽, 아래, 대각선 동시에 비교
a, b, c, d = board[i][j], board[i + 1][j], board[i][j + 1], board[i + 1][j + 1]
if a == b == c == d and a !=[]:
clear.add((i, j))
clear.add((i + 1, j))
clear.add((i, j + 1))
clear.add((i + 1, j + 1))
if len(clear) == 0:
break
# 루프 끝날때마다 제거
answer += len(clear)
for i, j in clear:
board[i][j] = []
clear = set()
#지워진 블럭들을 아래로 내리기
while True :
move = 0
# 가장 마지막 행에서는 배열의 범위를 초과하므로 m - 1
for i in range(m - 1):
for j in range(n):
if board[i][j] != [] and board[i+1][j] == []:
board[i][j],board[i + 1][j] = board[i + 1][j],board[i][j]
move = 1
if move == 0:
break
return answer
728x90