난이도 : D4
문제번호 : 6109
문제 주소 및 출처입니다.
목차
1. 문제 설명
2. 문제 해석
3. 소스 코드
1. 문제 설명
2048이라는 추억의 게임을 아는가? 2048은 한 때 유명했던 1인용 게임으로, 격자 위에서 숫자가 적힌 타일들을 밀어서 합치고 최종적으로 2048을 만들어 내는 것이 목표인 게임이다. 한번 타일을 밀 때는 상하좌우를 정해서 밀어야 한다. 방향을 정하면 격자 위에 있는 모든 타일이 그 방향으로 밀린다. 만약 어떤 타일이 밀리는 방향에 다른 타일이 있고, 두 타일에 적힌 숫자가 같다면 두 타일은 합쳐져 새로운 하나의 타일이 되고 이 타일에 적힌 숫자는 합쳐진 숫자들의 합이 된다. 이렇게 합쳐져서 만들어진 새로운 타일은 숫자가 같은 다른 타일이 밀려와도 합쳐져서는 안 된다. 만약 같은 숫자가 적힌 타일이 세 개 이상 있을 때는 헷갈리는 경우를 없애기 위해 빨리 벽에 닿게 될 타일을 먼저 민다고 생각한다. 예를 들어 “2 2 4 2 2 2”가 적힌 타일들이 있을 때, 이 타일들을 왼쪽으로 밀면 결과는 “4 4 4 2 0 0”이 된다. 0은 타일이 없는 빈 칸을 나타낸다. 위의 그림은 4×4 크기의 격자(일반적인 2048 게임)에서 모든 타일을 오른쪽으로 이동시킨 예이다. 우리는 2048게임을 N×N 크기의 격자에서 하려고 한다. 현재 격자에 어떤 식으로 타일이 있는지 주어지고, 타일들을 이동시킬 방향이 주어질 때, 타일을 모두 이동시키고 나면 격자가 어떻게 변할 지 계산하는 프로그램을 작성하라. |
입력
각 테스트 케이스의 첫 번째 줄에는 하나의 정수 N(1≤N≤20)과 하나의 문자열 S가 공백 하나로 구분되어 주어진다. |
출력
각 테스트 케이스마다 ‘#t’(t는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고 한 줄을 띄운 후, |
예시
입력 | 출력 |
2 5 up 4 8 2 4 0 4 4 2 0 8 8 0 2 4 4 2 2 2 2 8 0 2 2 0 0 2 down 16 2 0 2 |
#1 8 8 4 8 8 8 4 4 2 4 2 4 2 0 8 0 0 0 0 0 0 0 0 0 0 #2 0 0 16 4 |
2. 문제풀이
오른쪽으로 민다면 오른쪽부터 합쳐져야 하기때문에 오른쪽의 데이터부터 꺼내서 임시 리스트에 넣었다. |
3. 소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#D4 6109 추억의 2048게임
#up 혹은 down이면 좌표를 바꿔준다.
def swap(i, j):
global command
if command == 'up' or command == 'down':
return j, i
return i, j
#명령을 처리해주는 함수이다.
def start(n, command):
data = dict_lst[command]
#up down left right에 따라 반복문 조건을 바꾼다.
for a in range(data[0], data[1], data[2]):
temp = []
for j in range(data[3], data[4], data[5]):
i, j = swap(a, j)
#데이터가 0이 아닌것들만 더한다.
if list_2048[i][j]:
temp.append(list_2048[i][j])
list_2048[i][j] = 0
k = 0
#인근에 있는 값들을 더하고 팝시킨다.
while len(temp) > k+1:
if temp[k] == temp[k+1]:
temp[k] += temp[k+1]
temp.pop(k+1)
k+=1
#데이터를 처리했다면 다시 넣어준다.
for j in range(data[3], data[4], data[5]):
i, j = swap(a, j)
if not temp:
break
list_2048[i][j] = temp.pop(0)
T = int(input())
for t in range(1, T+1):
list_2048 = []
n, command = input().split()
n = int(n)
dict_lst = {'up': (0, n, 1, 0, n, 1), 'down': (n-1, -1, -1, n-1, -1, -1), 'left' : (0, n, 1, 0, n, 1), 'right' : (0, n, 1, n-1, -1, -1)}
#들어온 데이터를 리스트에 추가한다.
for i in range(n):
list_2048.append(list(map(int, input().split())))
start(n, command)
print("#{}".format(t))
#결과출력
for k in list_2048:
print(*k)
|
'코딩테스트 > SWExpertAcademy' 카테고리의 다른 글
수영장 Python(SW Expert Academy, SWEA) (0) | 2020.06.27 |
---|---|
정식이의 은행업무 Python(SW Expert Academy, SWEA) (0) | 2020.06.25 |
쇠막대 자르기 Python(SW Expert Academy, SWEA) (0) | 2020.06.23 |
최소 이동 거리 Python(SW Expert Academy, SWEA) (0) | 2020.06.22 |
최소 신장 트리 Python(SW Expert Academy, SWEA) (0) | 2020.06.21 |
댓글