[백준(baekjoon) 2108] 정렬 / 네가지 통계값을 구하는 문제 / 통계학
2017. 12. 4. 16:59ㆍAlgorithm
반응형
문제 백준2018
1 <= N <= 500,000을 만족하는 N이 주어질 때
네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
- 산술평균 : N개의 수들의 합을 N으로 나눈 값
- 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
- 최빈값 : N개의 수들 중 가장 많이 나타나는 값:
- 범위 : N개의 수들 중 최대값과 최소값의 차이
입출력
맨 처음 입력 값은 count(수의 개수) 값
입력 | 출력 |
5 1 3 8 -2 2 | 2 2 1 10 |
해결
문제가 쉬워서 따로 적지 않을까 했지만, 코드가 지저분해보여서 이해가 안되실까봐 적어둡니다.
산술평균
sum
을 따로 빼서 입력값들을 저장하고n
으로 나눕니다.- 핵심은 소수점 이하 첫째 자리에서 반올림 해야 한다는 것인데
저는 swift3의round
를 이용해서 해주었습니다.
중앙값
- 입력값들을 전부 배열에 저장해서 모든 입력을 받은 후
내장 함수sorted()
를 사용해 정렬해주었습니다.
최빈값
dictionary(map)
에 입력 값을key
로 하여count
값을 저장해줍니다.- 가장 최빈값의 count를 따로 저장해주어
dictionary(map)
에서value
가count
이하인 수를 모두 지워줍니다.
dictionary(map)
을key
를 기준으로 정렬합니다.
dictionary(map)
에는 최빈값들만 담겨있으므로count
가 1이상이면 1번째 인덱스, 아니라면 0번째 인덱스에 접근하면 됩니다.
범위
- 2에서 정렬된 배열을 활용합니다. (맨 처음과 마지막)
구현
주의사항
1.let countSorted = count.filter{ $0.value == mode }.sorted{ $0.key < $1.key }
이 코드를 백준 컴파일러가 인식하지 못하나봐요.
Xcode에선 잘 돌아가는데 언어 버전이 달라서 그런가 했지만 아래 코드는 잘돌아가는거 보니
연속으로 적어주는게 안되나 봅니다.
원인 파악하느라 돌려본다고 엄청 틀림…. ㅠㅠ
1.let filtered = count.filter{ $0.value == mode }
2.let countSorted = filtered.sorted{ $0.key < $1.key }
전체 코드
1.import Foundation
2.
3.let n = Int(readLine()!)!
4.var array: [Int] = []
5.var sum = 0
6.var count: [Int:Int] = [:]
7.var mode = 0
8.
9.for _ in 0..<n {
10. let input = Int(readLine()!)!
11. sum += input
12. count[input] = ( count[input] != nil ? count[input]! : 0 ) + 1
13. mode = mode < count[input]! ? count[input]! : mode
14. array.append(input)
15.}
16.
17.array = array.sorted()
18.let filtered = count.filter{ $0.value == mode }
19.let countSorted = filtered.sorted{ $0.key < $1.key }
20.
21.print(Int(round(Double(sum) / Double(n))))
22.print(array[n / 2])
23.print(countSorted[countSorted.count > 1 ? 1 : 0].key)
24.print(array.last! - array.first!)
반응형