[BOJ/Swift] 통계학 2108
Baekjoon Online Judge
단계별로 풀어보기 / 정렬 / 통계학 2108
문제에 모든 정보 및 저작권 https://www.acmicpc.net/
Todo:
수를 처리하는 것은 통계학에서 상당히 중요한 일이다.
통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다.
단, N은 홀수라고 가정하자.
산술평균 : N개의 수들의 합을 N으로 나눈 값
중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
최빈값 : N개의 수들 중 가장 많이 나타나는 값
범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
Constraints:
입력 제약:
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다.
단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다.
입력되는 정수의 절댓값은 4,000을 넘지 않는다.
출력 제약:
첫째 줄에는 산술평균을 출력한다.
소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다.
여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
Input-Output
(출처: https://www.acmicpc.net/problem/2108)
Solution.swift
import Foundation
let caseCount = Int(readLine()!)!
var nums = [Int:Int](), sortedNums = [Int]()
for _ in 0..<caseCount {
let inputNum = Int(readLine()!)!
if !nums.keys.contains(inputNum) {
nums.updateValue(1, forKey: inputNum)
} else {
nums[inputNum]? += 1
}
}
nums.sorted(by: { $0.key < $1.key }).forEach { element in
for _ in 0..<element.value {
sortedNums.append(element.key)
}
}
let sum = sortedNums.reduce(0, +)
print(String(format: "%.0f", Double(sum)/Double(caseCount)))
print(sortedNums[sortedNums.count/2])
let sorted = nums.filter{ $0.value == nums.values.max()! }.sorted(by: { $0.key < $1.key })
print(sorted.count < 2 ? sorted[0].key : sorted[1].key)
print(sortedNums[sortedNums.count-1] - sortedNums[0])
github Code Repository
How I tried this:
문제 자체가 어렵진 않은데 최빈값을 구하는 점 때문에 방향을 고민했다.
중복된 수의 횟 수를 체크하려고 처음 딕셔너리를 생각했는 데
중앙값은 keys의 가운데 값이 아니기 때문에 중복된 경우를 나열하는 배열도 필요했다.
문제를 애초에 배열과 중복 탐색이려나 생각했지만
두 개를 동시에 생성하는 방향을 생각했다.
빈도를 구하기위해 딕셔너리로 key-숫자 value-빈도를
입력시 저장하고
정렬을 하며 모든 값을 표현하는 배열만들고
정렬된 최소 최대, 중앙값을 얻음.
What I got is:
I have to study:
문제에 관한 모든 저작권 : https://www.acmicpc.net/