문제
https://www.acmicpc.net/problem/10825
10825번: 국영수
첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1
www.acmicpc.net
문제 설명
N명의 도현이네 반 학생들의 이름, 국어, 영어, 수학 점수를 받아 조건에 맞는 순서대로 이름을 출력한다.
조건은 다음과 같다.
1. 국어 점수가 감소하는 순서로
2. 국어 점수가 같으면 영어 점수가 증가하는 순서로
3. 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
4. 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로
(단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)
코드
import sys
input = __import__('sys').stdin.readline
def main():
N = int(input())
arr = []
for _ in range(N):
s = list(input().rstrip().split())
# 문자열로 저장된 점수를 정수로 변경
s[1] = int(s[1])
s[2] = int(s[2])
s[3] = int(s[3])
# arr 리스트에 리스트를 추가하여 이중 리스트가 된다.
arr.append(s)
# sorted 람다식을 이용하여 조건에 맞게 정렬
arr = sorted(arr, key = lambda std: [-std[1], std[2], -std[3], std[0]])
# 정렬된 순서대로 리스트 0번째에 존재하는 이름 출력
for i in range(N):
print(arr[i][0])
if __name__ == "__main__":
main()
익명 함수 lambda는 함수에 이름이 없고 한 번 사용하고 버리는 일회용 용도이다.
=> lambda x(매개 변수): expression(표현식)
add = lambda x, y : x + y
print(add(3, 2)) # 5
임의적으로 이름을 정할 수 있다.
이를 sorted 함수 key에 적용하면 원하는 조건으로 정렬할 수 있다.
아래 코드는 배열의 요소들의 각 길이를 구하고 그것을 오름차순으로 정렬하는 코드이다.
+ 배열의 각 요소는 먼저 'ab'는 2, 'cdef'는 4 ... 이런 식으로 치환된다.
+ 만약 값이 같아 동점자가 발생한다면 index가 빠른 순으로 정렬된다.
arr = ['ab', 'cdef', 'abcd', 'bcd', 'z']
arr = sorted(arr, key = lambda x: len(x))
print(arr)
# ['z', 'ab', 'bcd', 'cdef', 'abcd']
여러 개의 익명 함수의 표현식을 리스트나 튜플을 통해 묶으면,
여러 개의 기준으로 정렬할 수 있다.
arr = [['김', 13, 4.0], ['나', 15, 3.0], ['박', 13, 3.0],
['이', 14, 4.0], ['조', 14, 3.0], ['아', 15, 3.0]]
arr = sorted(arr, key=lambda std:[std[1], -std[2], std[0]])
print(arr)
# [['김', 13, 4.0], ['박', 13, 3.0], ['이', 14, 4.0], ['조', 14, 3.0], ['나', 15, 3.0], ['아', 15, 3.0]]
위 코드에서 arr은 각 학생들의 [이름(문자열), 나이(int형), 성적(float형)]을 갖고 있다.
코드의 조건 순서대로 정렬하고 출력한다.
std[1] => 나이순으로 오름차순 정렬
-std[2] => 나이가 같다면 성적순으로 내림차순 정렬
std[0] => 나이, 성적 모두 같다면 이름을 기준으로 사전순 정렬
'Algorithm Problems > 정렬' 카테고리의 다른 글
[백준/C++] 10814번: 나이순 정렬 (1) | 2024.05.03 |
---|---|
[백준/C++] 10989번: 수 정렬하기 3 (1) | 2024.04.28 |
[백준/C++] 11650번: 좌표 정렬하기 (0) | 2024.04.14 |
[백준/Python] 1302번: 베스트셀러 (0) | 2023.10.09 |
[백준/python] 8979번: 올림픽 (0) | 2023.07.26 |