반응형
Github
문제 링크
https://www.acmicpc.net/problem/10825
풀이
간단한 정렬문제입니다.
스위프트와 비교했을 때, 파이썬의 간편함을 알 수 있는 문제라 가져와 봤습니다.
문제의 정렬 조건은 이렇습니다.
- 국어 점수가 감소하는 순서로
- 국어 점수가 같으면 영어 점수가 증가하는 순서로
- 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
- 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)
정렬에 여러 키가 사용되며 오름차순, 내림차순이 섞여있습니다.
Swift에서는 이 내용을 조건문을 처리해야 합니다.
arr.sort {
if $0.k != $1.k {
return $0.k > $1.k
} else if $0.e != $1.e {
return $0.e < $1.e
} else if $0.m != $1.m {
return $0.m > $1.m
} else {
return $0.name < $1.name
}
}
같지 않다는 조건을 이용해 세부 정렬 조건을 정의하고 있습니다.
반면 파이썬은 단 한 줄로 문제 해결이 가능했습니다.
arr.sort(key = lambda x: (-int(x[1]), int(x[2]), -int(x[3]), x[0]))
lambda를 이용해 정렬 조건을 여러 개 정의할 수 있고, 내림차순에는 - 기호를 붙여 정의가 가능합니다.
Swift 전체 코드
import Foundation
let n = Int(readLine()!)!
var arr: [(name: String, k: Int, e: Int, m: Int)] = []
for _ in 0..<n {
let input = readLine()!.split { $0 == " " }.map { String($0) }
arr.append((input[0], Int(input[1])!, Int(input[2])!, Int(input[3])!))
}
arr.sort {
if $0.k != $1.k {
return $0.k > $1.k
} else if $0.e != $1.e {
return $0.e < $1.e
} else if $0.m != $1.m {
return $0.m > $1.m
} else {
return $0.name < $1.name
}
}
for name in arr.map { $0.name } {
print(name)
}
Python 전체 코드
import sys; readl = sys.stdin.readline
n = int(readl())
arr = [readl().split() for _ in range(n)]
arr.sort(key = lambda x: (-int(x[1]), int(x[2]), -int(x[3]), x[0]))
for item in arr:
print(item[0])
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.
반응형