알고리즘

💻 [백준][파이썬] 단계별로 풀어보기 - 정렬 모음(2750, 2587, 25305, 2751, 10989, 1427, 11650, 11651, 1181, 10814, 18870)

sehee00 2024. 12. 5. 16:19

https://www.acmicpc.net/step/9

 

2750 수 정렬하기 

N = int(input())
arr = []

for i in range(N):
    arr.append(int(input()))

arr.sort()
print('\n'.join(map(str, arr)))
  • Enter 간격으로 들어오는 1차원 배열 입력받기 
  • 리스트를 특정 조건에 맞게 출력하기 - join 함수 이용 # join함수는 내부 요소들이 str이어야 함! 

2587 대표값2 

arr = []

for _ in range(5):
    arr.append(int(input()))

arr.sort()
print(int(sum(arr)/5))
print(arr[2])

 

25305 커트라인 

N, k = map(int, input().split())
arr = list(map(int, input().split()))
 
arr.sort() 
print(arr[-k]) # 98
# print(arr[-k:-k+1]) # [98]
  • arr[-k:-k+1]로 출력하니 [] 대괄호 없이 출력이 안됨 -> 인덱싱 슬라이싱은 항상 리스트를 반환
  • 인덱싱(arr[-k])은 리스트의 특정 값을 직접 반환

2751 수 정렬하기2 

import sys
input = sys.stdin.readline

N = int(input())
arr = []

for _ in range(N):
    arr.append(int(input()))

arr.sort()
print('\n'.join(map(str, arr)))

 

 

💡 카운팅 정렬

count = [0, 0, 0, 0, 0, 0]
숫자 2 → count[2] += 1 → count = [0, 0, 1, 0, 0, 0]
숫자 3 → count[3] += 1 → count = [0, 0, 1, 1, 0, 0]
숫자 2 → count[2] += 1 → count = [0, 0, 2, 1, 0, 0]
숫자 5 → count[5] += 1 → count = [0, 0, 2, 1, 0, 1]
숫자 3 → count[3] += 1 → count = [0, 0, 2, 2, 0, 1]
  • 숫자의 개수를 세는 배열을 만들어 정렬하는 간단한 방법이다! 숫자 범위가 좁고 정수로만 이루어진 데이터에서 매우 효율적이다.
  • 데이터의 등장 횟수를 센다: 각 숫자가 몇 번 등장했는지 기록하는 배열(카운트 배열)을 사용한다. 
  • 카운트 배열을 기반으로 데이터를 출력: 등장 횟수만큼 해당 숫자를 출력하면 정렬된 결과가 나온다. 

 

10989 수 정렬하기3 

  • 수 정렬하기2와 동일하게 제출하면 '메모리 초과'
  • 힌트 >> 수의 범위가 작다면 카운팅 정렬을 사용하여 더욱 빠르게 정렬할 수 있습니다. 
import sys
input = sys.stdin.readline

N = int(input())
count = [0] * 10001 # 입력값이 10000개까지 주어지니 10000 + 1개의 리스트 선언

# 등장 횟수를 누적합으로 구하기 
for _ in range(N):
    input_num = int(input())
    count[input_num] += 1

# 인덱스 데이터만 출력 
for i in range(len(count)):
    for j in range(count[i]):
        print(i)

 

1427 소트인사이드

import sys
input = sys.stdin.readline

arr = list(map(int, input().strip()))
arr.sort()
print(''.join(map(str,arr[::-1])))
  • [ ] 대괄호 없이 출력: ''.join(map(str, list))

11650 좌표 정렬하기 

import sys
input = sys.stdin.readline

N = int(input())
arr = []

for _ in range(N):
    arr.append(list(map(int, input().split())))

arr.sort()
for i in range(N):
    print(' '.join(map(str, arr[i])))

 

 

11651 좌표 정렬하기2 

import sys
input = sys.stdin.readline

N = int(input())
arr = []

for _ in range(N):
    arr.append(list(map(int, input().split())))

# y좌표, x좌표 순서로 정렬
arr.sort(key=lambda x: (x[1], x[0]))

# arr.sort(key=lambda x: x[1])
for i in range(N):
    print(' '.join(map(str, arr[i])))
  • sort(key = lambda x: (x[1], x[0]): 다중 조건 정렬은 key를 이용 

1181 단어 정렬 

import sys
input = sys.stdin.readline

N = int(input())
arr = []
new_arr = []

for _ in range(N):
    arr.append(list(input()))

arr.sort()
arr.sort(key=lambda x: (len(x)))

for i in arr:
    if i not in new_arr:
        new_arr.append(i)

for i in range(len(new_arr)):
    print(''.join(map(str, new_arr[i])), end='')
  • 리스트 중복 제거: 기존 리스트 반복하며 새로운 리스트에 없으면 넣어줌 
  • 개행문자 제거하여 출력: end = ''

10814 나이순 정렬 

import sys
input = sys.stdin.readline

N = int(input())
arr = []

for _ in range(N):
    arr.append(list(input().split()))

for i in range(N):
    arr[i][0] = int(arr[i][0])

arr.sort(key=lambda x: x[0])
for i in range(N):
    print(' '.join(map(str, arr[i])))

 

 

💡 좌표 압축 

ex. 2, 4, -10, 4, -9

1. 중복을 제거하고, 값을 오름차순 정렬:
-10, -9, 2, 4

2. 각 값에 순위를 부여:
-10 -> 0
-9  -> 1
2   -> 2
4   -> 3

3. 원래 리스트에서 각 값의 순위를 찾아 변환:
2   -> 2
4   -> 3
-10 -> 0
4   -> 3
-9  -> 1

출력: 2 3 0 3 1

 

  • 좌표 압축은 큰 범위의 숫자 값을 작은 범위의 숫자로 변환하는 방법
  • 주어진 좌표를 크기순으로 정렬하여 상대적 순위를 계산 
  • 순위를 기준으로 좌표를 변환(압축)한 결과를 출력 
  • 즉, 작은 값부터 시작해 0부터 인덱스를 부여 

💡 enumerate 함수

 

enumerate(iterable, start=0)
# iterable: 반복 가능한(iterable) 객체, 예를 들면 리스트(list), 튜플(tuple), 문자열(str), 딕셔너리(dictionary) 등
# start: 인덱스의 시작값을 설정, 기본값은 0

fruits = ["apple", "banana", "cherry"]
for i in range(len(fruits)):
    print(f"과일 리스트에서 {i} 인덱스 요소는 {fruit} 이다")
    
#출력
#과일 리스트에서 1 인덱스 요소는 apple 이다
#과일 리스트에서 2 인덱스 요소는 banana 이다
#과일 리스트에서 3 인덱스 요소는 cherry 이다
  • "enumerate" 함수는 주로 for 루프와 함께 사용
  • for 루프는 반복 가능한(iterable) 객체를 순회하면서, 각 요소를 처리
  • 반복 가능한(iterable) 객체를 인자로 받아서 해당 객체의 요소들을 순회하면서, 각 요소의 인덱스와 값을 순서쌍으로 반환

18870 좌표 압축 

import sys
input = sys.stdin.readline

N = int(input())
arr = list(map(int, input().split()))

# 중복 제거 후 정렬 
sorted_unique = sorted(set(arr)) 

# 각 값을 순위(0부터 시작)로 매핑하는 딕셔너리를 생성
index_map = {value: idx for idx, value in enumerate(sorted_unique)}

# 원래 배열의 값을 순위로 변환하여 새로운 배열을 생성
result = [index_map[value] for value in arr]

print(' '.join(map(str, result)))
  • enumerate(): 각 요소의 인덱스와 값을 순서쌍으로 반환
  • 값 -> 순위로 매핑: value: idx