본문 바로가기
Algorithm/문제풀이_백준

Swift) 백준 2108 (통계학)

by Joahnee 2021. 8. 21.

요구능력 : 최빈값을 구할줄 아느냐

 

코드설명 : 

최빈값을 구하기 위해서는 Dictionary를 사용하는게 가장 알맞다.

꽤 오래 쓰지 않아서 간단하게 개념정리를 하고 넘어가야겠다.

 

딕셔너리 : 순서없이 키와 쌍의 값으로 구성되고, 키는 중복될 수 없다.

여러가지 선언방법이 있지만 여기서 사용한 선언방법

var dict = [Int: Int]()

 

2. 딕셔너리의 사용

dictionary에 값을 입력받을 때마다 바로바로 넣어주고 value가 없는경우에는 default값이 0이 들어가도록 해줬다.

그리고 입력받을 때마다 키의 value에 1씩 더해줘서 만약 3, 2, 2 0 을 입력하고 dict값을 출력해본다면

[3: 1, 2: 2, 0: 1] 이렇게 출력될것이다.

dict[num, default: 0] += 1

 

3. 딕셔너리 함수 max

max함수는 말 그대로 가장 큰 값을 불러오는 함수이다.

max함수의 by에 적혀있는 건 그냥 공식(?)느낌이라고 생각하면된다.

max함수의 return은 value가 가장 큰 optional(key : value) 이다.

그래서 optional풀어주고 그 중에 value값을 가져온것이다.

let maxValue = dict.max(by: {$0.value < $1.value})!.value

 

4. 딕셔너리 함수 filter

말그대로 조건에 맞게 필터링한다는 의미를 갖고있다.

조건에 맞는 새로운 Dictionary를 리턴해준다.

value값이 maxValue와 같은 것의 키들을 정렬해서 새로운 Dictionary를 생성한것이다.

var mode = dict.filter({ $0.value == maxValue}).keys.sorted()

 

 

후기 : 못풀겠어서 여러가지 답안을보고 구글링해봤는데,, 딕셔너리를 쓰는게 가장 이상적으로 보이는.... 바보같이 딕셔너리를 생각못했다... 딕셔너리 공부하는 좋은계기가 됐다.

 

import Foundation
let n = Int(readLine()!)!
var arr: [Int] = []
var average: Double = 0.0
var sum = 0
var dict = [Int:Int]()

for _ in 0..<n {
    let num = Int(readLine()!)!
    arr.append(num)
    dict[num, default: 0] += 1
}

//산술평균
for i in 0..<arr.count {
    sum += arr[i]
}
average = (Double(sum) / Double(arr.count))
print("\(Int(round(average)))")

//중앙값
arr.sort()
print("\(arr[((arr.count / 2))])")

//최빈값
let maxValue = dict.max(by: {$0.value < $1.value})!.value
var mode = dict.filter({ $0.value == maxValue}).keys.sorted()
if mode.count > 1 {
    print("\(mode[1])")
}else {
    print("\(mode[0])")
}

//범위
print("\(arr.max()! - arr.min()!)")

댓글