일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 장고 프로젝트 순서
- python
- 예술영화추천
- Blog
- 파이썬 웹프로그래밍 장고
- 독립영화플랫폼
- Exercism
- 개발
- Algorithm
- 자바스크립트
- mongodb
- MyPick31
- MYSQL
- 알고리즘
- 장고 개발 순서
- 타사인증
- 북마크앱
- 북마크만들기
- Node.js
- ART_Cinema
- Django Blog
- JavaScript
- til
- 프로젝트
- 장고
- Bookmark
- Django
- passport.js
- join()
- 장고 프로젝트
- Today
- Total
Juni_Dev_log
[탐색 및 시뮬레이션] 파이썬 알고리즘 문제 2-4 "두 리스트 합치기" 본문
[시간복잡도]
O(nlogn)
: for 문 1개 + sort() 사용
[공간복잡도]
O(n)
Problem
오름차순으로 정렬이 된 두 리스트가 주어지면 두 리스트를 오름차순으로 합쳐 출력하는 프로 그램을 작성하세요.
▣ 입력설명
첫 번째 줄에 첫 번째 리스트의 크기 N(1<=N<=100)이 주어집니다.
두 번째 줄에 N개의 리스트 원소가 오름차순으로 주어집니다.
세 번째 줄에 두 번째 리스트의 크기 M(1<=M<=100)이 주어집니다.
네 번째 줄에 M개의 리스트 원소가 오름차순으로 주어집니다.
각 리스트의 원소는 int형 변수의 크기를 넘지 않습니다.
▣ 출력설명
오름차순으로 정렬된 리스트를 출력합니다.
▣ 입력예제
3
1 3 5
5
2 3 6 7 9
▣ 출력예제
1 2 3 3 5 6 7 9
💯 Solution ①
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import sys
sys.stdin=open("input.txt","rt")
n1=int(input())
n1_list=list(map(int,input().split()))
n2=int(input())
n2_list=list(map(int,input().split()))
res=n1_list+n2_list
res.sort()
for i in res:
print(i, end=" ")
|
cs |
- 간단하게 리스트를 합치고 하나씩 띄어쓰기하고 찍어낸다.
💯 Solution ②
: Tutor 님 Code
=> sort() 를 사용하면 편하지만, 사용하지 않고 코드를 작성해보자.
sort() 를 사용하면 시간복잡도가 O(nlog(n)) 이 되는데, 애초에 값이 정렬되어있기 때문에 sort()를 사용하는 것보다 사용하지 않고 코드를 작성하는 것이 시간복잡도가 더 좋다.
sort() 를 사용한 경우 : O(nlogn)
sort() 를 사용하지 않은 경우 : O(n)
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
|
# sort()를 사용하지 않고 작성해보자
# 기존에 작성가능한 코드는 O(n) 인데 이를 O(nlogn)으로 바꿔보자
import sys
sys.stdin=open("input.txt","rt")
n=int(input())
a=list(map(int,input().split()))
m=int(input())
b=list(map(int,input().split()))
p1=p2=0
c=[]
# 하나의 포인트가 끝까지 가면 멈춤
while p1<n and p2<m:
if a[p1]<=b[p2]:
c.append(a[p1])
p1+=1
else:
c.append(b[p2])
p2+=1
# p1이 n까지 못가고 남음
if p1<n:
c=c+a[p1:]
if p2<m:
c=c+b[p2:]
for x in c:
print(x, end=" ")
|
cs |
- p1,p2 라는 값을 설정한다. 해당 값은 위치를 알려주는 포인터 역할이며, 초기값은 0이다.
- 합친 배열을 담을 c를 설정한다.
- while 문을 통해서, p1의 값이 n보다 작고 p2의 값이 m보다 작을 때 해당 조건문 코드가 동작한다.
- 만약, p1의 값이 n보다 크거나 p2의 값이 m보다 큰 경우가 발생한다면, 두 배열 중에서 하나의 배열을 다 돌았다는 것을 의미한다.
- 반복문의 조건을 성립한다면, 이제 a배열의 [p1] 값과 b배열의 [p2] 값을 비교해서 작은 값을 c에 가져다가 붙인다. (c.append(a[p1]) or c.append(b[p2]))
- 이럴 때, 다 돌지 않은 배열 (p1<n or p2<m)을 조건문으로 찾아서 다 돌지않은 배열의 나머지 리스트들을 c 뒤에 가져다가 붙이면 된다.
- 해당 출력양식에 맞춰서 for x in c: print(x, end=" ") 로 출력하면 된다.
📚 참고
[시간복잡도 계산]
wayhome25.github.io/python/2017/06/14/time-complexity/
[파이썬 메서드별 시간복잡도]
www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
'CodingTest > 인프런 (Algorithm)' 카테고리의 다른 글
[탐색 및 시뮬레이션] 파이썬 알고리즘 문제 2-6 "격자판 최대합" (0) | 2021.02.25 |
---|---|
[탐색 및 시뮬레이션] 파이썬 알고리즘 문제 2-5 "수들의 합" (0) | 2021.02.24 |
[탐색 및 시뮬레이션] 파이썬 알고리즘 문제 2-3 "카드 역배치" (0) | 2021.02.22 |
[탐색 및 시뮬레이션] 파이썬 알고리즘 문제 2-2 "숫자만 추출" (0) | 2021.02.22 |
[탐색 및 시뮬레이션] 파이썬 알고리즘 문제 2-1 "회문 문자열 검사" (0) | 2021.02.21 |