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 고차함수를 활용해서 평균을 넘는 학생의 수를 구함.