코딩테스트/✳️코드트리

[코드트리] 단 한 번의 2048 시도

@soohh 2024. 6. 20. 15:34

https://www.codetree.ai/missions/2/problems/one-trial-of-2048-game?&utm_source=clipboard&utm_medium=text

 

🔷 나의 구현 스케치

  1. move(grid, d) 함수:
    1. 입력받은 grid를 d(방향)에 따라 한 줄을 0을 제외한 숫자로 이루어진 line으로 만든다.
    2. 행 또는 열 단위로 plus(line, d) 함수를 호출하여 숫자를 합친다.
    3. 이동 후의 결과를 새로운 2차원 리스트에 저장하여 반환한다.
  2. plus(line, d) 함수:
    1. 입력받은 line이라는 리스트에서 같은 수가 인접해 있는 경우 해당 숫자를 합쳐서 2배로 만든다.
    2. 이미 합쳐진 수가 한번 더 합쳐지지 않도록 해당 위치의 값을 0으로 변경한다.
    3. d가 'R'(오른쪽) 또는 'D'(아래)일 경우 리스트를 역순으로 탐색하고, 그 외의 경우 정방향으로 탐색한다.
    4. 0인 값은 제거하고 새로운 리스트를 반환한다.

🔷  나의 구현 코드

def plus(line,d):
    if len(line) == 1:
        return line
    if d=='R' or d=='D':
        for i in range(len(line)-2,-1,-1):
            if line[i] == line[i+1]:
                line[i+1] = 2*line[i]
                line[i] = 0
    else:
        for i in range(1,len(line)):
            if line[i] == line[i-1]:
                line[i-1] = 2*line[i]
                line[i] = 0
    return [x for x in line if x]

def move(grid, d):
    ans = [[0]*4 for _ in range(4)]
    if d=='L' or d=='R':
        for row in range(4):
            line = [grid[row][col] for col in range(4) if grid[row][col]]
            new_line = plus(line,d)
            if d=='L':
                count = 0
                for i in range(len(new_line)):
                    ans[row][i] = new_line[i]
                    count += 1
            else:
                count = 3
                for i in range(len(new_line)-1,-1,-1):
                    ans[row][count] = new_line[i]
                    count -= 1
    else:
        for col in range(4):
            line = [grid[row][col] for row in range(4) if grid[row][col]]
            new_line = plus(line,d)
            if d=='U':
                count = 0
                for i in range(len(new_line)):
                    ans[count][col] = new_line[i]
                    count += 1
            else:
                count = 3
                for i in range(len(new_line)-1,-1,-1):
                    ans[count][col] = new_line[i]
                    count -= 1
    return ans
    
grid = [list(map(int,input().split())) for _ in range(4)]
d = input()
ans = move(grid, d)
for row in ans:
    print(*row)