[PYTHON] 리스트 합치기

  <중복제거하여 자동으로 오름차순이 되게 리스트 합치기>

 

  • 문제

두 리스트를 중복을 제거하면서 오름차순으로 합치세요

  • 알고리즘 표현

1. 각 list를 먼저 sort()로 정렬을 한후에 한개씩 비교하며 더 작은 값을 새로운 list에 추가한다.

2. 추가한 후에 다음 index값을 비교하여 또다시 더 작은 값을 추가하는 방식이다.

3. 비교를 끝낸 후, list의 남은 부분은 최종적으로 한번에 추가한다.

알고리즘 표현

  • input 값

  5 
  1 4 6 3 2 
  7 
  2 6 3 9 6 13 11

 

1) 첫번째 방법 -> 정석적인 방법대로, 알고리즘 표현 방식대로

- 리스트를 하나씩 비교하며, 추가

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
= int(input()) #n_list의 개수 5
n_list = list(map(int, input().split())) #[1, 4, 6, 3, 2]
n_list.sort() #미리 정렬
= int(input()) #m_list의 개수 7
m_list = list(map(int, input().split())) #[2, 6, 3, 9, 6, 13, 11]
m_list.sort() #미리 정렬
## 여기까지는 입력값 출력
 
n_index = 0 #n_list의 index표현
m_index = 0 #m_list의 index표현
 
sum_list = [] #순서대로 숫자를 넣을 빈 깡통을 만들어준다.
 
#아래 과정은 각 list를 미리 정렬했기때문에 가능하다.
while n_index<and m_index<M: #각 list를 한개씩 반복하기, 더 적은 list 개수까지만 반복
    if n_list[n_index]<m_list[m_index] : #0부터 넣은 index중
        sum_list.append(n_list[n_index]) #더 작은 값부터 넣기 위함.
        n_index+=1
    elif n_list[n_index]>m_list[m_index]:#0부터 넣은 index중
        sum_list.append(m_list[m_index]) #더 작은 값부터 넣기 위함.
        m_index+=1 
    elif n_list[n_index]==m_list[m_index]:#두값이 같다면 각 list의 index를 모두 +1을 해야한다.(중복방지)
        sum_list.append(m_list[m_index])
        m_index+=1 #중요
        n_index+=1 #중요
 
if n_index<N: #list의 남은 값들을 모두 넣어준다.
    sum_list+=n_list[n_index::] # 마지막 index 생략 가능
if m_index<M: #list의 남은 값들을 모두 넣어준다.
    sum_list+=m_list[m_index::] # 마지막 index 생략 가능
 
print(sum_list) #합쳐진 최종 list출력
cs

 

  • 결과값

  [1, 2, 3, 4, 6, 7, 10, 13]

 

2) 두번째 방법 -> 파이썬의 자료형인 set을 이용한 방법

set이 무엇이냐!!

list처럼 하나의 자료형인데, 자동정렬 및 자동중복제거를 가능하게 해줌

즉 이 set으로 바꾼것을 다시 list로 바꾸면 내가 원하는 list형식으로 볼수 있다.

 

1. list끼리 더하기 -> 행렬의 합처럼 더해지는 것이 아니라 이어 붙여준다.

2. set(list)로 바꾸기 -> 중복제거 및 자동정력

3. 다시 list(set(list)) -> list의 형태로 보여지기 위함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
n_list = [14632]
# N = int(input()) #n_list의 개수
= len(n_list) # 위 코드와 같은 역할을 할 것이다.
#n_list.sort() -> 정렬할 필요 없다
 
m_list = [263961311]
# M = int(input()) #m_list의 개수
= len(m_list) # 위 코드와 같은 역할을 할 것이다.
#m_list.sort() -> 정렬할 필요 없다
## 여기까지는 입력값 출력
 
sum_list = n_list + m_list
sum_set = set(sum_list) # 자료형을 list -> set으로 변경
print(sum_set) # 결과값 1 row: set자료형으로 출력하기
print(list(sum_set)) # 결과값 2 row :list자료형으로 출력하기
cs
  • 결과값

{1, 2, 3, 4, 6, 9, 11, 13}

[1, 2, 3, 4, 6, 7, 10, 13]

  • 배울코드

1. 미리 정렬을 하여 더 쉽게 비교할 수 있다는 것을 기억해야한다.

2. 중복되는 값이 있을 수도 있기 때문에 if - elif - elif 순으로 해야한다.

3. row 26중요 - 만약,if n_list = m_list 로 했었다면> m_list의 index값이 증가되지 않아 같은 값이 비교되어 중복값이 그대로 나타났을 것이다.

-> 이것만 뽑아내면 리스트의 교집합을 구할 수 있다.

4. 사실, 두번째 방법은 진짜 간단..-> 파이썬으로 풀거면 이렇게 하면되요

 

*)

어떤 피드백이든 댓글부탁드립니다.

더 좋은 방법이 있다면 알려주세요.

도움이 되셨다면, 하트버튼 또는 댓글부탁드려요~

요청할 문제가 있다면 댓글 부탁드려요!!!

*(

 

+ Recent posts