문제출처 |
5110. [파이썬 S/W 문제해결 기본] 7일차 - 수열 합치기
여러 개의 수열을 정해진 규칙에 따라 합치려고 한다. 다음은 3개의 수열이 주어진 경우의 예이다.
수열 1
2 |
3 |
4 |
5 |
수열 2
4 |
8 |
7 |
6 |
수열 3
9 |
10 |
15 |
16 |
수열 4
1 |
2 |
6 |
5 |
수열 2의 첫 숫자 보다 큰 수자를 수열 1에서 찾아 그 앞에 수열 2를 끼워 넣는다.
2 |
3 |
4 |
4 |
8 |
7 |
6 |
5 |
합쳐진 수열에 대해, 수열 3의 첫 숫자보다 큰 숫자를 찾아 그 앞에 수열 3을 끼워 넣는다. 큰 숫자가 없는 경우 맨 뒤에 붙인다.
2 |
3 |
4 |
4 |
8 |
7 |
6 |
5 |
9 |
10 |
15 |
16 |
마지막 수열까지 합치고 나면, 맨 뒤의 숫자부터 역순으로 10개를 출력한다.
1 |
2 |
6 |
5 |
2 |
3 |
4 |
4 |
8 |
7 |
6 |
5 |
9 |
10 |
15 |
16 |
[입력]
첫 줄에 테스트케이스의 수 T가 주어진다. 1<=T<=50
다음 줄부터 테스트 케이스의 별로 첫 줄에 수열의 길이 N, 수열의 개수 M, 이후 M개의 줄에 걸쳐 1000이하의 자연수로 구성된 수열이 주어진다. 4<=N<=1000, 1<=M<=1000
[출력]
각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 완성된 수열의 맨 뒤부터 10개의 숫자를 역순으로 출력한다.
[풀이 코드] - 파이썬
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
# 5110. [파이썬 S/W 문제해결 기본] 7일차 - 수열 합치기
class Node:
def __init__(self, d=0, p=None, n=None):
self.data = d
self.prev = p
self.next = n
class LinkedList:
def __init__(self):
self.head = None
self.tail = None
self.size = 0
def addList(lst, arr):
first = last = Node(arr[0])
for val in arr[1:]:
new = Node(val, last)
last.next = new
last = new
if lst.head is None:
lst.head, lst.tail = first, last
else:
cur = lst.head
while cur is not None:
if cur.data > arr[0]: break
cur = cur.next
if cur is None: # 뒤에 # 순서주의
first.prev = lst.tail
lst.tail.next = first
lst.tail = last
elif cur.prev is None: # 앞에
last.next = lst.head
lst.head.prev = last
lst.head = first
else: # 중간에 추가
prev = cur.prev
first.prev = prev
last.next = cur
prev.next = first
cur.prev = last
lst.size += len(arr)
def printList(lst): # 연결리스트 출력
if lst.head is None:
return
cur = lst.tail
cnt = 10
while cnt: # 역방향
print(cur.data, end=' ')
cur = cur.prev
cnt -= 1
print()
# import sys
# sys.stdin = open('input.txt')
for tc in range(1,int(input())+1):
n,m=map(int,input().split())
arr = list(list(map(int,input().split())) for _ in range(m)) # 2차원배열로 받기
mylist = LinkedList()
for i in range(m):
addList(mylist, arr[i])
print(f'#{tc}', end=' ')
printList(mylist)
|
'코딩테스트 \파이썬\자바 > SWEA D3' 카테고리의 다른 글
[SWEA][D3]1209. [S/W 문제해결 기본] 2일차 - Sum /파이썬/자바 (0) | 2021.01.01 |
---|---|
[SWEA][D3]1208. [S/W 문제해결 기본] 1일차 - Flatten /파이썬/자바 (0) | 2020.12.30 |
[SWEA] 5108. [파이썬 S/W 문제해결 기본] 7일차 - 숫자 추가 D3 파이썬 (0) | 2020.04.09 |
[SWEA][D3] 5099. [파이썬 S/W 문제해결 기본] 6일차 - 피자 굽기 D3 (0) | 2020.04.02 |
[SWEA][D3] 4676. 늘어지는 소리 만들기 D3 파이썬 (0) | 2020.03.11 |