코딩테스트

[Swift/Python] 백준 BOJ - 10825 국영수

유정주 2023. 6. 5. 08:22
반응형

Github

 

GitHub - jeongju9216/Algorithm: Swift/Python 알고리즘

Swift/Python 알고리즘. Contribute to jeongju9216/Algorithm development by creating an account on GitHub.

github.com

 

문제 링크

https://www.acmicpc.net/problem/10825

 

풀이

간단한 정렬문제입니다.

스위프트와 비교했을 때, 파이썬의 간편함을 알 수 있는 문제라 가져와 봤습니다.

 

문제의 정렬 조건은 이렇습니다.

  1. 국어 점수가 감소하는 순서로
  2. 국어 점수가 같으면 영어 점수가 증가하는 순서로
  3. 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
  4. 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)

정렬에 여러 키가 사용되며 오름차순, 내림차순이 섞여있습니다.

 

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

아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형