프로그래머스 - 코딩테스트 연습 - [1차] 프렌즈4블록(17679)
Lv2. [1차] 프렌즈4블록 (파이썬 문제 풀이)
문제 설명
블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록".
같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임이다.
자세한 문제에 대한 설명은 위의 링크를 참고해 주시길 바랍니다.
정답풀이
#17679
def solution(m, n, board):
answer = 0
count = 0
# string을 list로 변환 -> 2차원 리스트
for i in range(m):
board[i] = list(board[i])
# answerSet에 2*2 있을경우 인덱스 tuple 추가 + 인덱스 원소가 0일경우 추가 X / answerSet 반환
def search():
answerSet = set()
for i in range(m-1):
for j in range(n-1):
if (board[i][j] == board[i+1][j] == board[i][j+1] == board[i+1][j+1]) and board[i][j] != 0:
answerSet.add((i, j))
answerSet.add((i+1, j))
answerSet.add((i, j+1))
answerSet.add((i+1, j+1))
return answerSet
# Search 후 answerSet
def remove(lst):
for tup in lst:
board[tup[0]][tup[1]] = 0
# 0자리로 끌어내리기
def down():
for i in range(m-1,-1,-1):
for j in range(n):
if board[i][j] == 0:
for k in range(i-1,-1,-1):
if board[k][j] != 0:
board[i][j] = board[k][j]
board[k][j] = 0
break
## 메인 동작
while True:
answerList = list(search())
if len(answerList) == 0:
break
answer += len(answerList)
remove(answerList)
down()
return answer
풀이과정
하나하나의 과정을 함수로 만들어 풀었다.
가장 끝 코드의 메인동작 부분을 보면
1. 중복을 제외하고 없어질 캐릭터들의 인덱스쌍 set을 반환하는 search() 함수
2. 그 answerList (인덱스쌍)을 지우는(나는 0으로 바꿨다) remove() 함수
3. 지워진 자리 즉 0이 된 자리에 위의 캐릭터들을 끌어내리는 down() 함수로
구성되어 있다.
해당 메인 동작을 살펴보면
1. search() 함수로 반환한 set을 List로 치환 (이후 인덱스를 사용해야 하기 때문)
2. 만약에 List가 0개이면 지워질 캐릭터가 없다는 뜻이기에 반복문을 탈출한다.
3. answer에 List의 개수를 더한다 (이게 반복되면서 total 값이 나옴)
4. 지워질 캐릭터들을 0으로 바꾼다 - remove()
5. 0 부분을 위에 있는 캐릭터들을 끌어내려서 채운다 - down()
1-5 과정을 반복하는 메인 동작이다.
개별적 함수는 각 함수의 def를 보면 이해가 될 것이라고? 생각한다.
개인적 깨달음
1. 빡구현문제는 디테일한 부분이 까다롭다는 것을 체크해야 함
2. down() 함수 구현이 어려웠는데 이는 다른 방안도 생각해 봐야겠다.