[백준(baekjoon) 2108] 정렬 / 네가지 통계값을 구하는 문제 / 통계학

2017. 12. 4. 16:59Algorithm

반응형
[백준(baekjoon) 2108] 정렬 / 네가지 통계값을 구하는 문제 / 통계학

문제 백준2018

1 <= N <= 500,000을 만족하는 N이 주어질 때
네 가지 기본 통계값을 구하는 프로그램을 작성하시오.

  1. 산술평균 : N개의 수들의 합을 N으로 나눈 값
  2. 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
  3. 최빈값 : N개의 수들 중 가장 많이 나타나는 값:
  4. 범위 : N개의 수들 중 최대값과 최소값의 차이

입출력

맨 처음 입력 값은 count(수의 개수) 값

입력 출력
5
1
3
8
-2
2
2
2
1
10

해결

문제가 쉬워서 따로 적지 않을까 했지만, 코드가 지저분해보여서 이해가 안되실까봐 적어둡니다.

산술평균

  • sum을 따로 빼서 입력값들을 저장하고 n으로 나눕니다.
  • 핵심은 소수점 이하 첫째 자리에서 반올림 해야 한다는 것인데
    저는 swift3의 round를 이용해서 해주었습니다.

중앙값

  • 입력값들을 전부 배열에 저장해서 모든 입력을 받은 후
    내장 함수 sorted()를 사용해 정렬해주었습니다.

최빈값

  • dictionary(map)에 입력 값을 key로 하여 count값을 저장해줍니다.
  • 가장 최빈값의 count를 따로 저장해주어 dictionary(map)에서 valuecount 이하인 수를 모두 지워줍니다.
    • 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!)
반응형