관리 메뉴

JIE0025

[이것이코딩테스트다] ch6 정렬 본문

알고리즘

[이것이코딩테스트다] ch6 정렬

Kangjieun11 2023. 1. 24. 15:02
728x90

 

개념 복습은 나중으로 미루고 문제만 풀어보려고 가져왔다. 

 

✅ 파이썬의 정렬 라이브러리

 

 

⏺ sorted() 

  • 파이썬 기본 정렬 라이브러리
  • 병합정렬을 기반으로 만들어짐 
  • O(NlogN) 보장
  • 리스트, 딕셔너리, 자료형 등을 입력받아 정렬된 결과를 출력함. 

⏺ sort() 

내부요소 바로 정렬

 

 

arr = [7,5,2,9,0,3,1,6,4,8]

 

arr.sort()

result = sorted(arr)

>> [0,1,2,3,4,5,6,7,8,9]

 

arr.sort(reverse=True)

result = sorted(arr, reverse=True)

>> [9,8,7,6,5,4,3,2,1,0]

 

 

⏺ key를 이용해서 정렬기준 정하기

  • key에는 하나의 함수가 들어가야한다.
  • 람다를 사용하는 방식을 많이 사용한다

 

💻 1번째 요소를 기준으로  정렬하기

array = [('바나나',2),('사과', 5), ('당근', 3)]
result = sorted(array, key = lambda x : x[1] )

 

💻 길이를 기준으로  정렬하기 (오름차순)

array = ['but','i','wont','hesitate','no','more','no','more','it','cannot','wait','im','yours']
array.sort(key = lambda x : len(x) )

 

💻  다중 조건 정렬

 

  • 다중 정렬 조건을 설정하려면,  튜플로 우선순위가 높은 순서대로 적으면 됨
  • -를 붙이면, 현재 정렬차순과 반대로 된다.
arr = [(1, 3), (0, 3), (1, 4), (1, 5), (0, 1), (2, 4)]

# 첫번째 인자를 기준으로 오름차순 먼저 정렬
# 첫번째 인자 값이 같을 경우, 두번째 인자를 기준으로 내림차순 정렬
arr.sort(key = lambda x : (x[0], -x[1]))
# arr = [(0, 3), (0, 1), (1, 5), (1, 4), (1, 3), (2, 4)]

data_list.sort(key = lambda x :(x[1], x[0]))

 

 

 

dict  정렬

✔️ key값을 기준으로 정렬, key리스트를 반환

d = {..}
>>> sorted(d)
  • dict 안의 key를 올림차순으로 정렬한 key 리스트를 반환해준다.
    이때 key가 아닌 value로 정렬하려면 lambda를 사용해주면 된다.

 

✔️ value값을 기준으로 정렬,  key 리스트 반환

>>> sorted(d, key= lambda x : dict[x])

 

✔️ key값을 기준으로 정렬,  (key-value) 리스트 반환,  dict()

dict = {'A' : 1, 'D' : 4, 'C' : 3, 'B' : 2}

# ✅ Key를 이용한 정렬
# items() 함수는 key-value 쌍이 tuple로 구성된 리스트가 리턴되므로 딕셔너리를 key기준 정렬하려면 이렇게 사용한다.
sorted(dict.items())
# [('A', 1), ('B', 2), ('C', 3), ('D', 4)]

# ⏺ 내림차순 설정
dict = sorted(dict.items(), reverse=True)
# [('D', 4), ('C', 3), ('B', 2), ('A', 1)]

# ⏺ 리스트가 반환되므로 해당 정렬된것을 딕셔너리로 반환하려면 dict()를 사용하면된다.
dict(sorted(dict.items())

 

✅ 2 : 위에서 아래로

 

💻 CODE

import sys
input = sys.stdin.readline

n = int(input())
nums = [int(input()) for _ in range(n)]

nums.sort(reverse=True)
print(*nums)

 

 

✅ 3 : 성적이 낮은 순서로 학생 출력하기

 

💻 CODE

# 3 성적이 낮은 순서로 학생 출력하기 180p
import sys
input = sys.stdin.readline 

n = int(input())
info = [list(map(str,input().split())) for _ in range(n)]

info.sort(key= lambda x:int(x[1]))

for i in info:
    print(i[0], end=' ')

 

 

✅ 4 : 두 배열의 원소 교체

 


# a는 오름차순 정렬,
# b는 내림차순 정렬해서 


#k = 3 
#a = 1 2 3 4 5
#b = 6 6 5 5 5일 떄

# index 0~ 3될때까지 반복, a원소가 더 작으면 바꾸기.

만약 a원소가 b원소보다 크면 끝내기!

 

💻 CODE



import sys
input = sys.stdin.readline 

n,k = map(int,input().split())
a = list(map(int,input().split()))
b = list(map(int,input().split()))

a.sort()
b.sort(reverse=True)
for i in range(k):
    if (a[i]<b[i]):
        a[i], b[i] = b[i],a[i]
    else: 
        break

print(sum(a))