[Python] 12100번. 2048 (Easy)

2026. 1. 20. 23:15·coding test/Baekjoon

문제 링크

성능 요약

메모리: 32412 KB, 시간: 120 ms

분류

구현, 브루트포스 알고리즘, 시뮬레이션, 백트래킹

 

# 1.입력/변수 정의
N=int(input())
board=[list(map(int,input().split())) for _ in range(N)]
ans=0 

# 2.알고리즘
"""
DFS를 이용한다.
1. 한쪽 방향으로 보드를 민다(왼쪽 방향으로)
2. 민 보드를 계산한다
3. 계산된 보드는 다음 DFS로 넘긴다
4. 보드를 회전한다
-> 4방향으로 계속 돌려야하므로 총 모든 경우의 수는 4^5=1024
"""

def rotate(b):
    return list(zip(*b[::-1]))

def move_left(b):
    new_board=[]
    for row in b:
        tmp=[x for x in row if x!=0]
        new_row=[]
        i=0
        while i<len(tmp):
            if i+1<len(tmp) and tmp[i]==tmp[i+1]:
                new_row.append(tmp[i]*2)
                i+=2
            else:
                new_row.append(tmp[i])
                i+=1
        new_row+=[0]*(N-len(new_row))
        new_board.append(new_row)
    return new_board

def dfs(c,b):
    global ans

    # 만약 5번 이동시켰다면
    if c==5:
        for r in b:
            ans=max(ans,max(r))
        return

    for _ in range(4):
        next_board=move_left(b)
        dfs(c+1, next_board)
        b=rotate(b)

# 3.출력
# 4방향으로 돌릴 수 있다
dfs(0,board)
print(ans)

 

이번 문제는 

2026.01.06 - [coding test/Baekjoon] - [Python] 23796. 2,147,483,648 게임

 

[Python] 23796번. 2,147,483,648 게임

문제 링크성능 요약메모리: 32412 KB, 시간: 36 ms분류구현 첫 제출은 하드코딩으로 구현하여 보았다.더보기#1.입력matrix=[list(map(int,input().split())) for _ in range(8)]cmd=input()#2.자료형 정의#3.동작 알고리즘

wish404.tistory.com

백준의 23796번 문제와 유사했다고 생각한다.

하지만 최대 5번을 이동시킨다고 생각하면 총 4^5=1024번의 경우를 생각해야하는데 다행히 이번 문제에서는 시간 초과가 나지는 않았다.

이 문제의 경우 모든 경우를 생각할 수 밖에 없는 문제이기도 하다.

 

한 보드에서 위/아래/왼쪽/오른쪽으로 밀 것인지 총 4가지의 경우의 수가 나온다.

처음에는 단순히 하드코딩을 생각했는데 질문 게시판을 보니까 보드를 회전해서 풀길래 굉장하다고 생각했고 `rotate`라는 함수를 정의해 for문으로 하니 엄청 간단해졌다!

보드는 회전하는 코드는 엄청 간단했는데 `zip`을 사용하였다.

 

파이썬 `zip()`함수는 여러 iterable(리스트, 튜플 등)의 동일한 인덱스에 있는 요소들을 순서대로 묶어 튜플로 반환한다.

그렇기 때문에 `list(zip(*b[::-1]))`은 다음과 같이 나오게 된다.

 

예시를 들면

예제

b=[
    [1,2,3],
    [4,5,6],
    [7,8,9]
]

1. `b[::-1]` ▶ 행 순서 뒤집기

[
    [7,8,9],
    [4,5,6],
    [1,2,3]
]

2. `*b[::-1]` ▶ 언패킹(unpacking) 

`zip(*b[::-1])`은 결국 `zip([7,8,9],[4,5,6],[1,2,3])`이 된다.

`zip(*b[::-1])` = `zip([7,8,9],[4,5,6],[1,2,3])`

3. `zip(*b[::-1])` ▶ 열→행 변환 전치

`zip(*b[::-1])`은 같은 인덱스에 있는 값을 묶는다.

그렇기 때문에 다음과 같은 결과가 된다.

(7, 4, 1)
(8, 5, 2)
(9, 6, 3)

4. `list(...)` ▶ 최종 리스트 변환

zip의 결과는 리스트가 아니다.

그렇기 때문에 나온 결과를 `list`로 감싸서 `list`로 만든다.

[
	(7, 4, 1),
	(8, 5, 2),
	(9, 6, 3),
]

 

'coding test > Baekjoon' 카테고리의 다른 글

[Python] 14502번. 연구소  (0) 2026.01.09
[Python] 23796번. 2,147,483,648 게임  (1) 2026.01.06
[Python] 13460번. 구슬 탈출 2  (0) 2026.01.02
[Python] 5430번. AC  (0) 2025.12.20
[Python] 11438번 LCA 2  (0) 2025.12.15
'coding test/Baekjoon' 카테고리의 다른 글
  • [Python] 14502번. 연구소
  • [Python] 23796번. 2,147,483,648 게임
  • [Python] 13460번. 구슬 탈출 2
  • [Python] 5430번. AC
wish404
wish404
자동 로그
  • wish404
    wish-log
    wish404
    • 홈
    • 태그
    • 방명록
    • github
    • 분류 전체보기 (75) N
      • log (8)
        • 블로그 관리 (5)
        • 에러 모음 (2)
      • coding test (47)
        • Algorithm (4)
        • Baekjoon (34)
        • SW Expert Academy (6)
        • etc (3)
      • 프로그래밍 언어 (7)
        • JAVA (7)
      • 데이터 엔지니어링 (5)
        • Kafka (0)
        • Spark (4)
        • Airflow (1)
        • Elasticsearch (0)
      • 머신러닝&딥러닝 (3)
        • Kaggle 스터디 (3)
        • 논문 리뷰 (0)
        • MLOps (0)
      • 신입 개발자가 되기까지 (5) N
        • 취준일기 (1)
        • SSAFY (2)
        • 프로젝트 (1) N
        • CS 공부 (1)
  • 인기 글

  • 태그

    다익스트라
    dijk
    그리디
    Dijkstra
    최단 경로
    SSAFY
    heapq
    dp
    싸피
    후위순회
    dfs
    복습
    플로이드워샬
    BFS
    틀린문제
    전위순회
    벨만포드
    그리디 알고리즘
    복습해야지
    중위순회
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
wish404
[Python] 12100번. 2048 (Easy)
상단으로

티스토리툴바