happy318
팽도리블로그
happy318
전체 방문자
오늘
어제
  • 전체글 (252)
    • 공부 (5)
      • Algorithm 정리 (0)
      • 논문리뷰 (1)
      • C++ (2)
      • Python (2)
      • Java (0)
      • Back-end (0)
      • Front-end (0)
      • Embedded (0)
    • 코딩테스트 (218)
      • Python 문제풀이 (100)
      • C++ 문제풀이 (108)
      • Python template (9)
      • C++ template (1)
    • 일상 (20)
      • 맛집 (13)
      • 쇼핑 (5)
      • 아무 일상 (2)
    • 게임 (9)
      • 메이플스토리 (9)

최근 글

인기 글

hELLO · Designed By 정상우.
happy318

팽도리블로그

코딩테스트/Python 문제풀이

[백준] 2048 (Easy)

2022. 6. 25. 19:34

https://www.acmicpc.net/problem/12100

 

12100번: 2048 (Easy)

첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2

www.acmicpc.net

구현 문제입니다.

 

문제부터 아주 간단하게 요약하면, 흔히 우리가 플레이 하는 2048을 문제에서 주어진 조건에 맞게 implement 하는 문제입니다. 이 때, 총 5번의 이동을 거친후 남게 될 수 있는 가장 큰 숫자가 무엇인지를 return 해야 합니다. 

 

<Solution>

move 함수는 현재 보드의 상태와, 이동방향을 받아서 새로운 보드를 만들어주는 함수입니다. 이 move 함수만 올바르게 implement 하면, dfs등의 완전 탐색을 통해 문제를 해결할 수 있습니다. 

 

list를 순회하면서 합칠수 있는 것들을 합치도록 구현하였습니다. 상하좌우로 움직이는 경우에 중복되는 코드가 많이 있는데 이러한 코드들은 압축시키면 좀 더 깔끔해 질 것 같습니다. 

 

실제 구현은 아래와 같습니다.

import sys

N = int(sys.stdin.readline().rstrip())

# build array
array = []
for _ in range(N):
    array.append(list(map(int,sys.stdin.readline().rstrip().split())))

def move(array, direction): 
    new_array = []
    if direction == 0: # left
        for line in array:
            tmp = []
            e1 = 0
            e2 = 0
            for i in range(N):
                if line[i] != 0 and e1 == 0:
                    e1 = line[i]
                elif line[i] != 0 and e1 != 0:
                    e2 = line[i]
                    if e1 == e2:
                        tmp.append(e1+e2)
                        e1 = 0
                        e2 = 0
                    else:
                        tmp.append(e1)
                        e1 = e2
                        e2 = 0
                else:
                    continue
            if e1 != 0:
                tmp.append(e1)
            for _ in range(N-len(tmp)):
                tmp.append(0)
            new_array.append(tmp)
    elif direction == 1: # right
        for line in array:
            line.reverse()
            tmp = []
            e1 = 0
            e2 = 0
            for i in range(N):
                if line[i] != 0 and e1 == 0:
                    e1 = line[i]
                elif line[i] != 0 and e1 != 0:
                    e2 = line[i]
                    if e1 == e2:
                        tmp.append(e1+e2)
                        e1 = 0
                        e2 = 0
                    else:
                        tmp.append(e1)
                        e1 = e2
                        e2 = 0
                else:
                    continue
            if e1 != 0:
                tmp.append(e1)
            for _ in range(N-len(tmp)):
                tmp.append(0)
            tmp.reverse()
            new_array.append(tmp)
    elif direction == 2: # up
        for line in list(map(list, zip(*array))):
            tmp = []
            e1 = 0
            e2 = 0
            for i in range(N):
                if line[i] != 0 and e1 == 0:
                    e1 = line[i]
                elif line[i] != 0 and e1 != 0:
                    e2 = line[i]
                    if e1 == e2:
                        tmp.append(e1+e2)
                        e1 = 0
                        e2 = 0
                    else:
                        tmp.append(e1)
                        e1 = e2
                        e2 = 0
                else:
                    continue
            if e1 != 0:
                tmp.append(e1)
            for _ in range(N-len(tmp)):
                tmp.append(0)
            new_array.append(tmp)
        new_array = list(map(list, zip(*new_array)))
    else: # down (3)
        for line in list(map(list, zip(*array))):
            line.reverse()
            tmp = []
            e1 = 0
            e2 = 0
            for i in range(N):
                if line[i] != 0 and e1 == 0:
                    e1 = line[i]
                elif line[i] != 0 and e1 != 0:
                    e2 = line[i]
                    if e1 == e2:
                        tmp.append(e1+e2)
                        e1 = 0
                        e2 = 0
                    else:
                        tmp.append(e1)
                        e1 = e2
                        e2 = 0
                else:
                    continue
            if e1 != 0:
                tmp.append(e1)
            for _ in range(N-len(tmp)):
                tmp.append(0)
            tmp.reverse()
            new_array.append(tmp)
        new_array = list(map(list, zip(*new_array)))

    return new_array

answer = 0

def dfs_search(times, array):
    global answer
    if times >= 5:
        if max(map(max, array)) > answer:
            answer = max(list(map(max, array)))
            return
        else:
            return
    for i in range(4):
        dfs_search(times+1, move(array, i))

dfs_search(0, array)
print(answer)
반응형

'코딩테스트 > Python 문제풀이' 카테고리의 다른 글

[백준] 문자열 폭발  (0) 2022.06.26
[백준] N과 M (2)  (0) 2022.06.25
[백준] 웜홀  (0) 2022.06.25
[백준] 최단경로  (0) 2022.06.24
[백준] 곱셈  (0) 2022.06.24
    '코딩테스트/Python 문제풀이' 카테고리의 다른 글
    • [백준] 문자열 폭발
    • [백준] N과 M (2)
    • [백준] 웜홀
    • [백준] 최단경로
    happy318
    happy318

    티스토리툴바