(Swift) 백준 4344 평균은 넘겠지

SteadySlower·2022년 5월 10일
0

Coding Test

목록 보기
18/305

4344번: 평균은 넘겠지

처음 풀이

import Foundation

let C = Int(readLine()!)!

(0..<C).forEach { _ in
    var input = readLine()!.split(separator: " ").map { Double(String($0))! }[0...]
    let count = input.popFirst()!
    let avg = input.reduce(0, +) / count
    var overAvg = 0.0
    for score in input {
        if score > avg {
            overAvg += 1
        }
    }
    print(String(format: "%0.3f", round(overAvg / count * 100000) / 1000) + "%")
}
  • popFirst를 사용하기 위해서는 SubSequence로 만들어야 한다! 만드는 방법은 [0...]을 붙이면 된다.
    • 다른 사람들은 popFirst하지 않고 그냥 평균을 구할 때 [1...]의 방식으로 사용하는 경우도 있었음.
  • 나누기 & 소수점이 개입된 연산은 Int가 아니라 Double로 캐스팅해서 사용하자!
  • Swift는 round(반올림), ceil(올림), floor(버림) 함수를 제공하는데 Foundation 모듈을 import해야 쓸 수 있다.
    • 모든 함수는 소수점이 기준이므로 특정 소수점까지 계산하기를 원한다면 10의 배수를 곱해주고 다시 나누는 방식을 사용해야 한다.
  • String(format: ,)을 통해 특정 소수점까지 출력하게 할 수 있다.

개선된 풀이

import Foundation

let C = Int(readLine()!)!

(0..<C).forEach { _ in
    var input = readLine()!.split(separator: " ").map { Double(String($0))! }[0...]
    let count = input.popFirst()!
    let avg = input.reduce(0, +) / count
    let overAvg = Double(input.filter({ $0 > avg }).count)
    print(String(format: "%0.3f", round(overAvg / count * 100000) / 1000) + "%")
}
  • 반복문을 사용하지 않고 filter 고차함수를 활용해서 평균을 넘는 학생의 수를 구함.
profile
백과사전 보다 항해일지(혹은 표류일지)를 지향합니다.

0개의 댓글