코딩테스트 연습 - [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