두 리스트 합치기
오름차순으로 정렬이 된 두 리스트가 주어지면 두 리스트를 오름차순으로 합쳐 출력하는 프로그램을 작성하세요.
▣ 입력설명
첫 번째 줄에 첫 번째 리스트의 크기 N(1<=N<=100)이 주어집니다.
두 번째 줄에 N개의 리스트 원소가 오름차순으로 주어집니다.
세 번째 줄에 두 번째 리스트의 크기 M(1<=M<=100)이 주어집니다.
네 번째 줄에 M개의 리스트 원소가 오름차순으로 주어집니다.
각 리스트의 원소는 int형 변수의 크기를 넘지 않습니다.
▣ 출력설명
오름차순으로 정렬된 리스트를 출력합니다.
▣ 입력예제 1
3
1 3 5
5
2 3 6 7 9
▣ 출력예제 1
1 2 3 3 5 6 7 9
코드
n = int(input())
nlist = list(map(int,(input().split())))
m = int(input())
mlist = list(map(int,(input().split())))
ans = nlist + mlist
ans.sort()
print(ans, end=' ')
파이썬의 sort()는 퀵정렬이며 시간복잡도는 O(n logn) 이다.
이미 정렬되어 있다는 사실을 이용하면 8번만 반복되기만 하면 O(n) 으로 끝낼 수 있다.
n = int(input())
nlist = list(map(int,(input().split())))
m = int(input())
mlist = list(map(int,(input().split())))
ans = []
# 같거나 작으면 n 추가, else m추가
p1, p2 = 0, 0
while (True):
if nlist[p1] <= mlist[p2]:
ans.append(nlist[p1])
p1 += 1
if p1==n:
break
elif nlist[p1] > mlist[p2]:
ans.append(mlist[p2])
p2 += 1
if p2==n:
break
if p1==n: # nlist가 먼저 끝났다면
for i in range(p2, m):
ans.append(mlist[i])
elif p2==m: # mlist가 먼저 끝났다면
for i in range(p1, n):
ans.append(nlist[i])
''' 위와 같은 방식
if p1==n:
ans = ans + mlist[p1:]
elif p2==m:
ans = ans + nlist[p2:]
'''
for x in ans: # 리스트를 옆으로 출력
print(x, end=' ')
리스트의 인덱스 끼리 비교해서 O(n) 으로 끝낼 수 있다.
'⏰ 코딩테스트 > 리스트 탐색' 카테고리의 다른 글
격자판 최대합 (0) | 2021.09.27 |
---|---|
백준 알고리즘 - 2003 - 수들의 합 2 (0) | 2021.09.27 |
백준 알고리즘 - 10804 - 카드 역배치 (0) | 2021.09.24 |
숫자만 추출 (0) | 2021.09.16 |
회문 문자열 검사 (0) | 2021.09.16 |