개발 공부/알고리즘 이론

[삼성SW테스트 준비] 2. 정렬

5묘 2022. 8. 10. 00:16

학습자료: 알파카고수님의 블로그(https://m.blog.naver.com/wpghks7/221584382367

 

[파이썬으로 시작하는 삼성 SW역량테스트] - 2. 정렬

입력을 받았다면 앞으로는 필수적인 모듈과 내장함수를 공부하겠다. 아직 본론에 들어가기보다는 역량 테스...

blog.naver.com


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번: 수 정렬하기

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

# 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])