TIL/알고리즘 공부

백준 2108번 Swift 알고리즘 연습

여의도사노비 2022. 9. 10. 18:45
728x90

평균, 중간값, 빈도수, 범위 네 가지를 구해주면 되는 문제이다.

평균, 중간값, 범위 까지는 간단했는데.. 빈도수를 구하는데 조금 시간이 걸렸다.

근데 그냥 생각나는대로 코드를 짰더니 코드가 엄청 덕지 덕지 만들어졌다 ㅠㅠ

 

 

이 문제를 풀면서 생각한 논리적 흐름은

  1. 평균 -> 입력받은 값들을 전부 더한 뒤 N으로 나눈다.
  2. 중간값 -> 배열을 정렬해준뒤, N을 2로 나누고 소수점을 버린 위치가 항상 중간값이다.(홀수 N만 입력받기 때문에)
  3. 빈도 -> 딕셔너리를 만들고 딕셔너리 내의 key와 value 값을 비교해 max value를 구해준다.
  4. 빈도 -> max value와 dict 내의 element가 같을 경우 mode 배열에 값을 추가해준다.
  5. 빈도 -> mode 배열 내의 값이 1개 초과인 경우 겹치는 max value가 있는 것이기 때문에 두 번째 인자 값을 출력해준다.
  6. 빈도 -> mode 배열 내의 값이 1개인 경우 겹치는 max value가 없기 때문에 mode 인자값을 출력해준다.
  7. 범위 -> 배열을 정렬하고 가장 작은 값과 가장 큰 값의 차를 절대값으로 계산해준다.

 

 

* 2108번

import Foundation

let N = Int(readLine()!)!
var array = [Int]()
var dict = [Int:Int]()

var average = 0
var median = Int((Double(N) / Double(2)))
var freq = 0
var range = 0

if N == 1 {
    var K = Int(readLine()!)!
    print(K)
    print(K)
    print(K)
    print(0)

} else {

    for _ in 1...N {
        var M = Int(readLine()!)!
        array.append(M)
        average += M
        dict[M, default: 0] += 1
    } // 산술

    print(Int((Double(average) / Double(N)).rounded())) // 산술평균

    print(array.sorted()[median]) // 중간값

    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])")
    } // 빈도

    range = abs(array.sorted()[0] - array.sorted()[N-1]) // 범위
    print(range) // 범위

}

 

 

정리(Today I Learned)

  1. 없음