[12100] 2048(Easy) (골드 2)

isanghaessi·2022년 2월 2일
0

백준

목록 보기
2/10

12100번: 2048 (Easy)

2048게임을 했을 때 5번만에 나오는 제일 큰 숫자를 찾는 문제다.

고려했던 사항은 다음과 같다.

  • 한쪽으로 밀면 모두 한 쪽 끝으로 이동한다.
  • 같은 숫자가 있으면 합쳐진다.
    • 숫자가 합쳐질 때 3개라면 합쳐지는 쪽 먼저 합쳐진다.
  • 같은 숫자가 같은 줄에 있더라도 중간에 다른 숫자가 끼면 합치지 않는다.

구현문제지만 조건도 많고 까다로운 문제였다. 특히, 중복되는 코드가 많아서 불편하지만 합치는 시간보다 그냥 구현하는게 효율적인것 같다.

import sys

def move(board, dir, count):
  global answer

  if count > 5:

    return
  if dir == 'left':
    for l in range(n):
      k = 0
      i = 0
      while i < n:
        if board[l][i] > 0:
          current = board[l][i]
          j = i + 1
          while j < n:
            if current == board[l][j]:
              board[l][i] = 0
              board[l][j] = 0
              i = j
              board[l][k] = current * 2

              break
            elif board[l][j] != 0:

              break
            j += 1
          if i != j:
            board[l][i] = 0
            board[l][k] = current
          k += 1
        i += 1
  elif dir == 'right':
    for l in range(n):
      k = n - 1
      i = n - 1
      while i >= 0:
        if board[l][i] > 0:
          current = board[l][i]
          j = i - 1
          while j >= 0:
            if current == board[l][j]:
              board[l][i] = 0
              board[l][j] = 0
              i = j
              board[l][k] = current * 2

              break
            elif board[l][j] != 0:

              break
            j -= 1
          if i != j:
              board[l][i] = 0
              board[l][k] = current
          k -= 1
        i -= 1
  elif dir == 'up':
    for l in range(n):
      k = 0
      i = 0
      while i < n:
        if board[i][l] > 0:
          current = board[i][l]
          j = i + 1
          while j < n:
            if current == board[j][l]:
              board[i][l] = 0
              board[j][l] = 0
              i = j
              board[k][l] = current * 2

              break
            elif board[j][l] != 0:

              break
            j += 1
          if i != j:
            board[i][l] = 0
            board[k][l] = current
          k += 1
        i += 1
  else:
    for l in range(n):
      k = n - 1
      i = n - 1
      while i >= 0:
        if board[i][l] > 0:
          current = board[i][l]
          j = i - 1
          while j >= 0:
            if current == board[j][l]:
              board[i][l] = 0
              board[j][l] = 0
              i = j
              board[k][l] = current * 2

              break
            elif board[j][l] != 0:

              break
            j -= 1
          if i != j:
            board[i][l] = 0
            board[k][l] = current
          k -= 1
        i -= 1
  answer = max(answer, max(map(max, board)))
  for _dir in dirs:
    move([b[:] for b in board], _dir, count + 1)

n = int(sys.stdin.readline().strip())
board = [[] for _ in range(n)]
for i in range(n):
  line = map(int, sys.stdin.readline().strip().split(' '))
  for l in line:
    board[i].append(l)
dirs = ['left', 'right', 'up', 'down']
answer = 0
for dir in dirs:
  move([b[:] for b in board], dir, 1)

print(answer)
profile
seungyong HONG

0개의 댓글