728x90
문제
https://www.acmicpc.net/problem/12100
풀이
큐를 이용해 행 혹은 열에서 0이 아닌 값들을 저장해놓는다.
board의 크기만큼 반복문을 돌며
- 큐의 길이가 2이상인 경우에 앞 혹은 뒤의 두 숫자가 같으면 pop() + pop() 값을
- 위의 조건이 성립하지 않은 경우 큐가 남아 있다면 pop() 값을
- 큐가 비어있다면 0을
board에 저장한다.
DFS를 활용해 모든 경우의 수를 탐색하며 가장 큰 값을 저장한다.
DFS 함수에서 deepcopy()를 사용해 함수를 거친 board 값이 다음 함수에 들어가지 않도록 해줘야 한다.
코드
import sys
from collections import deque
from copy import deepcopy
result = 0
n = int(sys.stdin.readline())
board = []
for _ in range(n):
board.append(list(map(int, sys.stdin.readline().split())))
def move(board, dir):
if dir == 0: # 위쪽으로 이동
for i in range(n):
queue = deque([board[j][i] for j in range(n) if board[j][i] != 0])
for j in range(n):
if len(queue) > 1 and queue[0] == queue[1]:
board[j][i] = queue.popleft() + queue.popleft()
else:
board[j][i] = queue.popleft() if queue else 0
elif dir == 1: # 아래쪽으로 이동
for i in range(n):
queue = deque([board[j][i] for j in range(n) if board[j][i] != 0])
for j in range(n)[::-1]:
if len(queue) > 1 and queue[-1] == queue[-2]:
board[j][i] = queue.pop() + queue.pop()
else:
board[j][i] = queue.pop() if queue else 0
elif dir == 2: # 왼쪽으로 이동
for i in range(n):
queue = deque([x for x in board[i] if x != 0])
for j in range(n):
if len(queue) > 1 and queue[0] == queue[1]:
board[i][j] = queue.popleft() + queue.popleft()
else:
board[i][j] = queue.popleft() if queue else 0
elif dir == 3: # 오른쪽으로 이동
for i in range(n):
queue = deque([x for x in board[i] if x != 0])
for j in range(n)[::-1]:
if len(queue) > 1 and queue[-1] == queue[-2]:
board[i][j] = queue.pop() + queue.pop()
else:
board[i][j] = queue.pop() if queue else 0
return board
def DFS(board, L):
global result
if L == 5:
result = max(result, max(map(max, board)))
print(board)
else:
for i in range(4):
DFS(move(deepcopy(board), i), L + 1)
DFS(board, 0)
print(result)
728x90
'🚩 코딩테스트 > 알고리즘' 카테고리의 다른 글
[프로그래머스] 큰 수 만들기 (0) | 2023.01.21 |
---|---|
[백준] 2630번: 색종이 만들기 (0) | 2022.11.05 |
[프로그래머스] 모음 사전 (0) | 2022.09.27 |
[LeetCode] 102. Binary Tree Level Order Traversal (0) | 2022.09.08 |
[프로그래머스] 소수 찾기 (1) | 2022.09.05 |