array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
for i in range(len(array)): # i는 0부터 마지막 인덱스까지, 정렬이 될 원소를 가리킴
min_index = i
for j in range(i + 1, len(array)): # 0 ~ i-1 까지는 정렬이 됐으므로 그 뒷 부분을 확인
if array[min_index] > array[j]: # j 인덱스로 끝까지 돌면서 최소값을 선택
min_index = j
array[i], array[min_index] = array[min_index], array[i] # i의 위치에 선택한 최소값으로 swap
print(array)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
for i in range(1, len(array)): # i : 앞 부분에 삽입할 원소의 인덱스
for j in range(i, 0, -1): # j를 이용해서 삽입할 원소의 위치를 앞으로 한칸 씩 이동시킨다.
if array[j] < array[j - 1]:
array[j], array[j - 1] = array[j - 1], array[j]
else:
# 이미 i의 앞 쪽은 오름차순 정렬이 되어있으므로
# 자기보다 작은 숫자가 앞에 위치할 때까지 이동한 다음에 이동을 종료한다.
break
print(array)
일반적인 방식
array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]
def quick_sort(array, start, end):
if start >= end:
# 종료 조건
# start == end -> 파티션에 존재하는 원소의 개수가 1개임을 의미
# start > end -> 파티션에 원소가 존재하지 않음을 의미
return
pivot = start # 피벗을 기준으로 작은 원소는 왼쪽으로, 큰 원소는 오른쪽으로 분할
left = start + 1 # 왼쪽에서 피벗보다 큰 원소를 찾아서 오른쪽으로 보낸다
right = end # 오른쪽에서 피벗보다 작은 원소를 찾아서 왼쪽으로 보낸다
while (left <= right): # left와 right가 교차되면 반복문 종료
while (left <= end and array[left] <= array[pivot]):
# left는 왼쪽부터 피벗보다 큰 원소를 찾을 때까지 오른쪽으로 한 칸씩 이동한다.
left += 1
while (right > start and array[right] >= array[pivot]):
# right는 오른쪽부터 피벗보다 작은 원소를 찾을 때까지 왼쪽으로 한 칸씩 이동한다.
right -= 1
if (left > right):
# left와 right가 교차되면 피벗위치의 원소와 right위치의 원소를 swap한다
# 즉, 분할을 시행하고 반복문이 종료된다
array[right], array[pivot] = array[pivot], array[right]
else:
# left와 right가 교차되지 않았다면 두 원소를 swap한 후 반복한다
array[left], array[right] = array[right], array[left]
# right의 위치로 피벗 원소가 이동하고 분할이 완료되었기 때문에
# 나뉜 두 부분에 대해 다시 sort를 진행한다.
quick_sort(array, start, right - 1)
quick_sort(array, right + 1, end)
quick_sort(array, 0, len(array) - 1)
print(array)
파이썬의 장점을 살린 방식 (리스트 슬라이싱, 리스트 컴프리헨션)
left
right
인덱스를 사용하지 않고 파이썬의 리스트 기능들을 이용해 간단하게 구현함array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]
def quick_sort(array):
# 종료 조건 : 분할된 리스트가 하나 이하의 원소만을 담고 있는 경우
if len(array) <= 1:
return array
pivot = array[0]
tail = array[1:]
left_side = [x for x in tail if x <= pivot] # 왼쪽 분할 : 피벗보다 크기가 작은 원소들
right_side = [x for x in tail if x > pivot] # 오른쪽 분할 : 피벗보다 크기가 큰 원소들
# 분할 각각에 대해 퀵정렬을 수행하고 리턴
return quick_sort(left_side) + [pivot] + quick_sort(right_side)
print(quick_sort(array))
array = [7, 5, 9, 0, 3, 1, 6, 2, 9, 1, 4, 8, 0, 5, 2]
# 가장 작은 데이터부터 가장 큰 데이터까지의 범위가 모두 담길 수 있도록 리스트를 생성한다.
count = [0] * (max(array) + 1)
# 데이터를 하나씩 확인하며 데이터의 값과 동일한 인덱스의 데이터를 1씩 증가시킨다.
for i in range(len(array)):
count[array[i]] += 1
# 두 배열의 원소 교체
# 입력
n, k = map(int, input().split())
array_a = list(map(int, input().split()))
array_b = list(map(int, input().split()))
# 정렬
array_a.sort()
array_b.sort(reverse=True)
# 바꿔치기
for i in range(k):
if array_a[i] < array_b[i]:
array_a[i] = array_b[i]
else:
break
# 출력
print(sum(array_a))
# 좌표 정렬하기
import sys
input = sys.stdin.readline
# 입력
n = int(input())
array = []
for _ in range(n):
array.append(list(map(int, input().split())))
# 정렬
array.sort()
# 출력
for i in range(n):
print(f'{array[i][0]} {array[i][1]}')
# 좌표 정렬하기 2
# 좌표 정렬하기 1에서 y와 x의 위치만 바꿔서 정렬
import sys
input = sys.stdin.readline
# 입력
n = int(input())
array = []
for i in range(n):
x, y = map(int, input().split())
array.append([y, x])
array.sort()
# 출력
for i in range(n):
print(f'{array[i][1]} {array[i][0]}')
# 단어 정렬
import sys
input = sys.stdin.readline
# 집합 51개를 가지는 리스트 생성
word_set_list = [set() for _ in range(51)]
# 입력
n = int(input())
for _ in range(n):
word = input().rstrip()
word_set_list[len(word)].add(word)
# 정렬 & 출력
for word_set in word_set_list:
if len(word_set) == 0:
continue
word_set = sorted(word_set)
print('\n'.join(word_set))
# 좌표 압축
import sys
input = sys.stdin.readline
n = int(input())
number_list = list(map(int, input().split()))
number_set = set(number_list)
number_set = sorted(number_set)
number_dict = {}
for i in range(len(number_set)):
number_dict[number_set[i]] = i
for x in number_list:
print(number_dict[x])
# for x in number_list:
# print(number_set.index(x), end=' ')
# O(n^2)으로 시간 초과 발생