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