학습자료: 알파카고수님의 블로그(https://m.blog.naver.com/wpghks7/221584382367)
1) 오름차순 정렬하기
오름차순 정렬에는 두 가지 방법이 있다.
하나는 sort()를 이용해 배열 자체를 변환시키는 방법이다.
# 오름차순 정렬하기
# a 자체를 변환시키는 방법
a = [1, 5, 7, 4, 6]
a.sort()
print(a)
# 출력: [1, 4, 5, 6, 7]
다른 하나는 sorted(배열) 형태로 배열을 변경하는 대신, 반환값으로 정렬해 넘겨주는 방식이다.
# 오름차순 정렬하기
# a를 변경하지 않고 반환값으로 정렬해 넘겨주는 방식
a = [1, 5, 7, 4, 6]
b = sorted(a)
print(a, b)
# 출력:[1, 5, 7, 4, 6]
2) 내림차순 정렬하기
# 내림차순 정렬
a = [1, 5, 7, 4, 6]
a.sort(reverse = True)
print(a)
연습문제: 백준 2750 수 정렬하기(https://www.acmicpc.net/problem/2750)
# 2750 수 정렬하기
T = int(input())
arr = list(int(input()) for _ in range(T))
arr.sort()
for i in arr:
print(i)
3) 정렬 기준 정하기
만약 (3,2), (5,4), (5,7) 같은 형태의 x,y꼴 좌표가 있을 때, 보통 sort 함수를 사용하게 되면
1. x좌표를 오름차순으로, 2. x좌표가 같다면 y좌표를 오름차순으로 한다.
그렇다면 만일 y좌표만 정렬의 기준으로 하고 싶다면? 다음과 같이 하면 된다.
a = [list(map(int, input().split())) for _ in range(5)]
a.sort(key = lambda x:x[1])
print(a)
람다를 잘 몰라서 간단하게 람다 사용법을 요약해보자면, 'lambda 매개변수: 표현식' 으로 사용하며,
한 함수를 다른 함수로 치환할 때나(예: input = lambda : sys.stdin.readline()), 위처럼 정렬 시 사용한다.
만약 y좌표를 오름차순으로 하고, y좌표가 같다면 x좌표를 내림차순으로 하고 싶을 때는? 다음과 같이 하면 된다.
a = [list(map(int, input().split())) for _ in range(5)]
a.sort(key=lambda x:(x[1], -x[0]))
print(a)
연습문제: 백준 10825 국영수
# 10825 국영수 4376ms
# 파이썬은 리스트 안에 자료형 여러개 있어도 상관 x
# 이 문제는 sys.stdin 안쓰면 시간초과가 날 수밖에 없음.
T = int(input())
arr = []
for tc in range(1, T+1):
a, *b = input().split()
b = list(map(int, b))
arr.append((a, b))
arr.sort(key=lambda x:(-x[1][0], x[1][1], -x[1][2], x[0]))
for i in range(T):
print(arr[i][0])
sys.stdin을 받지 않은 데다 처음에 불필요한 가변리스트를 만드느라 시간을 필요 이상으로 소비했다.
아래의 모범답안처럼 map을 이용해 모두 문자열로 받아서, 나중에 int()로 만들면 시간이 훨씬 줄어든다.(위대한 파이썬)
# 모범답안 508ms
import sys
input = lambda : sys.stdin.readline().rstrip()
T = int(input())
arr = []
for tc in range(T):
name, kor, math, eng = input().split()
arr.append([name, int(kor), int(math), int(eng)])
arr.sort(key=lambda x:(-x[1], x[2], -x[3], x[0]))
for x in arr:
print(x[0])
'개발 공부 > 알고리즘 이론' 카테고리의 다른 글
[삼성SW테스트 준비] 4. 순열과 조합 (0) | 2022.08.10 |
---|---|
[삼성SW테스트 준비] 3. 큐, 스택, 덱 (0) | 2022.08.10 |
[삼성SW테스트 준비] 1. 입력받기 (0) | 2022.08.05 |
[알고리즘 공부] 3. 완전 탐색(brute force) (0) | 2022.08.02 |
[알고리즘 공부] 2. 배열, 동적 배열, 단일 연결 리스트 (0) | 2022.07.09 |