[BOJ] 18382번 2048

nunddu·2020년 8월 6일
1

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

문제요약

  • 사용자 점수, 퍼즐 조작정보, 초기 퍼즐의 상태가 주어진다.
  • 퍼즐 조작 직후에 동일한 값을 갖는 퍼즐 조각이 맞닿은 경우 퍼즐을 합치고 사용자는 합쳐진 퍼즐 조각만큼의 점수를 획득한다.
  • 조작이 완료된 후 최종 사용자 점수를 출력한다.

접근

  • 먼저 입력된 조작 순으로 퍼즐을 변형한다.
  • 상,하,좌,우 조작을 판단해서 퍼즐을 행 단위, 열 단위로 처리한다.
  • 퍼즐의 행 또는 열에 대해 다음 세 가지를 수행한다.
    • 퍼즐 위치가 공백인 경우 이동 방향으로 당겨오기
    • 퍼즐 위치가 공백인 경우 이동 방향으로 밀어주기
    • **인접한 퍼즐이 같은 값인 경우 합치고 공백 없애기 **

코드

from collections import deque
def move_puzzle(state,direction):
    global score
    if direction=='front': # 왼쪽, 위쪽으로 퍼즐을 이동하는 경우
        for i in range(3): # 이동 방향으로 당겨오기
            if state[i]==0:
                state[i],state[i+1]=state[i+1],state[i]
        for i in range(3,0,-1): # 이동 방향으로 밀어주기
            if state[i-1]==0:
                state[i],state[i-1]=state[i-1],state[i]
        for i in range(3): # 합치고 공백 없애주기
            if state[i]==state[i+1]:
                state[i]*=2
                state[i+1]=0
                score+=state[i]
                for j in range(i+1,3):
                    state[j],state[j+1]=state[j+1],state[j]
    else: # 오른쪽, 아래쪽으로 퍼즐을 이동하는 경우
        for i in range(3,0,-1): # 이동 방향으로 당겨오기
            if state[i]==0:
                state[i],state[i-1]=state[i-1],state[i]
        for i in range(3): # 이동 방향으로 밀어주기
            if state[i+1]==0:
                state[i],state[i+1]=state[i+1],state[i]
        for i in range(3,0,-1): # 합치고 공백 없애주기
            if state[i]==state[i-1]:
                state[i]*=2
                state[i-1]=0
                score+=state[i]
                for j in range(i-1,0,-1):
                    state[j],state[j-1]=state[j-1],state[j]
    return state

def update_puzzle(key,num,y,x):
    direction='front' if key=='L' or key=='U' else 'back'
    if key in 'LR':
        for i in range(4):
            update=move_puzzle([x for x in puzzle[i]],direction) # 퍼즐의 행단위 처리
            for j in range(4): # 이동된 퍼즐 반영
                puzzle[i][j]=update[j]
    elif key in 'UD':
        for i in range(4):
            update=move_puzzle([puzzle[j][i] for j in range(4)],direction) # 퍼즐의 열단위 처리
            for j in range(4): # 이동된 퍼즐 반영
                puzzle[j][i]=update[j]
    puzzle[y][x]=num # 새로 추가된 퍼즐 조각

score=int(input())
controls=input()
puzzle_init=list(map(int,input().split()))[::-1]

puzzle=[[0 for col in range(4)] for row in range(4)]
puzzle=[[puzzle_init.pop() for col in range(4)] for row in range(4)]
controls=list(map(''.join, zip(*[iter(controls)]*4)))
controls=deque(controls)

while len(controls)>0:
    key,num,y,x=controls.popleft()
    update_puzzle(key,int(num),int(y),int(x))
print(score)

🤗

0개의 댓글