ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ/Swift] 통계학 2108
    Legacy/Be Refactoring.. 2021. 9. 13. 01:22

    Baekjoon Online Judge

    단계별로 풀어보기 / 정렬 / 통계학 2108

    문제에 모든 정보 및 저작권 https://www.acmicpc.net/


    Todo:

    수를 처리하는 것은 통계학에서 상당히 중요한 일이다.
    통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다.
    단, N은 홀수라고 가정하자.

    산술평균 : N개의 수들의 합을 N으로 나눈 값
    중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
    최빈값 : N개의 수들 중 가장 많이 나타나는 값
    범위 : N개의 수들 중 최댓값과 최솟값의 차이
    N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.

    Constraints:

    입력 제약:
    첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다.
    단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다.
    입력되는 정수의 절댓값은 4,000을 넘지 않는다.

    출력 제약:
    첫째 줄에는 산술평균을 출력한다.
    소수점 이하 첫째 자리에서 반올림한 값을 출력한다.

    둘째 줄에는 중앙값을 출력한다.

    셋째 줄에는 최빈값을 출력한다.
    여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.

    넷째 줄에는 범위를 출력한다.

    Input-Output


    (출처: https://www.acmicpc.net/problem/2108)

    Solution.swift

    import Foundation
    
    let caseCount = Int(readLine()!)!
    var nums = [Int:Int](), sortedNums = [Int]()
    
    for _ in 0..<caseCount {
        let inputNum = Int(readLine()!)!
        if !nums.keys.contains(inputNum) {
            nums.updateValue(1, forKey: inputNum)
        } else {
            nums[inputNum]? += 1
        }
    }
    
    nums.sorted(by: { $0.key < $1.key }).forEach { element in
        for _ in 0..<element.value {
            sortedNums.append(element.key)
        }
    }
    
    let sum = sortedNums.reduce(0, +)
    print(String(format: "%.0f", Double(sum)/Double(caseCount)))
    print(sortedNums[sortedNums.count/2])
    let sorted = nums.filter{ $0.value == nums.values.max()! }.sorted(by: { $0.key < $1.key })
    print(sorted.count < 2 ? sorted[0].key : sorted[1].key)
    print(sortedNums[sortedNums.count-1] - sortedNums[0])
    

    github Code Repository

    How I tried this:

    문제 자체가 어렵진 않은데 최빈값을 구하는 점 때문에 방향을 고민했다.
    중복된 수의 횟 수를 체크하려고 처음 딕셔너리를 생각했는 데
    중앙값은 keys의 가운데 값이 아니기 때문에 중복된 경우를 나열하는 배열도 필요했다.
    문제를 애초에 배열과 중복 탐색이려나 생각했지만

    두 개를 동시에 생성하는 방향을 생각했다.
    빈도를 구하기위해 딕셔너리로 key-숫자 value-빈도를
    입력시 저장하고

    정렬을 하며 모든 값을 표현하는 배열만들고
    정렬된 최소 최대, 중앙값을 얻음.

    What I got is:

    I have to study:

    문제에 관한 모든 저작권 : https://www.acmicpc.net/

    'Legacy > Be Refactoring..' 카테고리의 다른 글

    [BOJ/Swift] 좌표 정렬하기 11650  (0) 2021.09.12
    [BOJ/Swift] 단어 정렬 1181  (0) 2021.09.12
    [BOJ/Swift] 나이순 정렬 10814  (0) 2021.09.12
    [BOJ/Swift] 좌표 압축 18870  (0) 2021.09.12
    [BOJ/Swift] 좌표정렬하기 2 11651  (0) 2021.09.12
Designed by Tistory.