[Swift 코테] 백준 2108 통계학

2022. 6. 2. 22:42Swift 코딩테스트/Swift 백준 문제 풀이

728x90

산술평균, 중앙값, 범위를 구하는 것은 모두에게 문제가 없을 것이라고 생각한다.

그래서 최빈값에 대해서만 적어보겠다.

 

처음엔 계수 정렬을 사용해서 최빈값을 따로 계산하려고 했는데 -> 음수를 고려해서 배열의 인덱스를 다시 설정해야 하는 번거로움이 있었다.


그래서 서치 결과 딕서너리의 활용법을 통해 문제를 풀 수 있었다.

 

1. 숫자를 입력받을 때 dictionary의 key값에 숫자를 value에 += 1을 해주는 방식으로 dictionary를 세팅한다.

let input = Int(readLine()!)!
var arr = [Int](repeating: 0, count: input)
var dict = [Int: Int]()
for i in 0..<input{
    arr[i] = Int(readLine()!)!
    dict[arr[i], default: 0] += 1
}

dictionary를 default값을 0으로 설정하고 += 1 하는 방법을 알게 되었다.

 

2. dictionary에서 key값(숫자)의 최대값이 아닌 value값(나온 횟수)의 최댓값을 찾아야 한다.

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

 

3. 최빈값은 여러개일 수 있기 때문에 dictionary의 value(나온 횟수)의 최댓값을 max값과 비교해서

    같은 것이 있다면 그 key값을 기준으로 정렬한다.

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

 

4. 문제에 주어진 조건에서 최댓값이 여러 개라면 key값 기준으로 두 번째로 작은 값을 출력하는 것이었다.

if mode.count > 1{
    print(mode[1])
}else{
    print(mode[0])
}

 

=> 이렇게 dictionary를 활용하는 방법을 알게되었다. 다음에 유용하게 써 보겠다.

 

 

 

 

 

//코드

let input = Int(readLine()!)!
var arr = [Int](repeating: 0, count: input)
var dict = [Int: Int]()
for i in 0..<input{
    arr[i] = Int(readLine()!)!
    dict[arr[i], default: 0] += 1
}


//평균
let avg = arr.reduce(0, {
    (first: Int, second: Int) -> Int in
    return first + second
})
print(Int(round(Double(avg) / Double(input))))


//중앙값
arr = arr.sorted()
print(arr[input/2])


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

//범위
print(arr[input-1] - arr[0])

 

 

 

 

728x90