초기 보드를 나타내는 2048 게임 보드와 스와이프 방향을 나타내는 문자열 방향이 있다고 가정하면 다음 보드 상태를 찾아야 합니다. 2048 게임에서 알 수 있듯이 우리는 4개의 방향("U", "D", "L" 또는 "R"). 스와이프하면 모든 숫자가 가능한 한 그 방향으로 이동하고 동일한 인접 숫자가 정확히 한 번 더됩니다.
따라서 입력이 다음과 같으면
방향 ="L", 출력은
이 문제를 해결하기 위해 다음 단계를 따릅니다.
-
방향이 "R"과 같으면
-
보드 :=보드를 시계 반대 방향으로 두 번 회전
-
-
그렇지 않으면 방향이 "U"와 같을 때
-
보드 :=보드를 시계 반대 방향으로 한 번 회전
-
-
그렇지 않으면 방향이 "D"와 같을 때
-
보드 :=보드를 시계 반대 방향으로 세 번 회전
-
-
범위 0에서 3까지의 i에 대해 수행
-
row :=board[i]
에 있는 0이 아닌 모든 요소의 목록 -
0에서 2 사이의 j에 대해 수행
-
j + 1 <행 및 행의 크기[j]가 행[j + 1]과 같으면
-
행[j] :=행[j] * 2
-
행 제거[j + 1]
-
-
-
행의 크기가 <4인 동안 수행
-
행 끝에 0 삽입
-
-
보드[i] :=행
-
-
방향이 "R"과 같으면
-
보드 :=보드를 시계 반대 방향으로 두 번 회전
-
-
그렇지 않으면 방향이 "U"와 같을 때
-
보드 :=보드를 시계 반대 방향으로 세 번 회전
-
-
그렇지 않으면 방향이 "D"와 같을 때
-
보드 :=보드를 시계 반대 방향으로 한 번 회전
-
-
리턴 보드
더 나은 이해를 위해 다음 구현을 살펴보겠습니다.
예시
class Solution: def solve(self, board, direction): if direction == "R": board = rot_anti_clock_dir(rot_anti_clock_dir(board)) elif direction == "U": board = rot_anti_clock_dir(board) elif direction == "D": board = rot_anti_clock_dir(rot_anti_clock_dir(rot_anti_clock_dir(board))) for i in range(4): row = [x for x in board[i] if x] for j in range(3): if j + 1 < len(row) and row[j] == row[j + 1]: row[j] *= 2 del row[j + 1] while len(row) < 4: row += [0] board[i] = row if direction == "R": board = rot_anti_clock_dir(rot_anti_clock_dir(board)) elif direction == "U": board = rot_anti_clock_dir(rot_anti_clock_dir(rot_anti_clock_dir(board))) elif direction == "D": board = rot_anti_clock_dir(board) return board def rot_anti_clock_dir(x): x = [[x[i][j] for i in range(4)] for j in range(4)] return x[::-1] ob = Solution() matrix = [ [2, 0, 0, 2], [2, 2, 2, 2], [0, 4, 2, 2], [2, 2, 2, 0]] print(ob.solve(matrix, "L"))
입력
matrix = [ [2, 0, 0, 2], [2, 2, 2, 2], [0, 4, 2, 2], [2, 2, 2, 0]]
출력
[ [4, 0, 0, 0], [4, 4, 0, 0], [4, 4, 0, 0], [4, 2, 0, 0]]