-
블록 게임코딩 테스트/Level 4 2022. 12. 10. 01:08반응형
https://school.programmers.co.kr/learn/courses/30/lessons/42894
처음에는 한 줄 한 줄 0과 블록과 빈칸을 따져가면서 코딩했는데.
생각지 못한 케이스가 많아서, 하나를 해결하면 다른 케이스가 문제가 되는 상황.방향을 바꿔 문제에서 주어진 데로 코딩해 보았다.
단, 검은 블록(-1)은 두 개씩 떨어트렸다.
세로로 된 L자형 블록은 지울 때 검은 블록 2개가 필요하니까..처음 시도했던 것 보다 구현도 간단하고 깔끔하다.
보드의 모든 좌표에서 2*3, 3*2 탐색을 하면서 블록을 체크한다.
6칸의 보드가 기본 블록 4개와 검은 블록 2개로 가득 차 있으면 지울 수 있다.
Counter와 most_common을 이용해서 이를 확인했다.이때 구성 블록의 종류는 2종류,
그중 가장 많은 수는 0보다 커야 하며 개수는 4개,
그다음 많은 수는 -1이어야 하며 개수는 2개.def solution(board): from collections import Counter def find_block(y, x, dy, dx): if y + dy <= len(board) and x + dx <= len(board): collection = [board[y + iy][x + ix] for iy in range(dy) for ix in range(dx)] most_common = Counter(collection).most_common() if len(most_common) == 2: # 2가지 종류의 블록으로 구성되어야 한다. num1, counter1 = most_common[0] # 4개의 양수 num2, counter2 = most_common[1] # 2개의 -1 if num1 > 0 and counter1 == 4 and num2 == -1 and counter2 == 2: return True return False def delete_block(y, x, dy, dx): for iy in range(dy): for ix in range(dx): board[y + iy][x + ix] = 0 def solve(): answer, count = 0, -1 while count != 0: count = 0 for x in range(len(board)): # 검은 블록 떨어트리기 for y in range(len(board)): if board[y][x] > 0: if y > 0: board[y - 1][x] = -1 if y > 1: board[y - 2][x] = -1 break for x in range(len(board)): # 지울 수 있는 블록 찾기 for y in range(len(board)): for dy, dx in ((3, 2), (2, 3)): if find_block(y, x, dy, dx): delete_block(y, x, dy, dx) count += 1 answer += count return answer return solve()
파이썬에는 do while 구문이 없어서...
반응형