본문 바로가기

PS/백준

[BOJ] 백준 2108 통계학 (Swift)

반응형

문제

https://www.acmicpc.net/problem/2108

 

2108번: 통계학

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

www.acmicpc.net

풀이

수를 입력받아서 산술평균, 중앙값, 최빈값, 범위를 구하는 문제입니다.

먼저 입력받은 수를 Int 배열에 넣어주겠습니다.

가장 먼저, 산술평균을 구해봅시다.

산술평균N개의 수들의 합을 N으로 나눈 값 이고, 소수점 이하 첫째 자리에서 반올림한 값을 출력해주어야 합니다.
Int 배열에 넣어줬기 때문에 합을 N으로 나눈다면 반올림한 값을 구할 수 없을 것입니다.
고차함수 map을 사용해 Double 자료형의 배열로 만들어 준 후, N으로 나누어 줬습니다.
그 이후 round를 사용해 반올림 해준 후, 이것을 Int 자료형으로 변환해주면 산술평균을 구할 수 있습니다.

중앙값은 단순히 배열의 n/2 번째 인덱스의 요소를 출력해주면 됩니다. N은 항상 홀수이기 때문입니다.

최빈값은 어떻게 구할 수 있을까요?
저는 Dictionary를 사용했습니다.

Dictionary의 생성자인 init(_:uniquingKeysWith:) 를 사용하였습니다.

https://developer.apple.com/documentation/swift/dictionary/init(_:uniquingkeyswith:) 

 

init(_:uniquingKeysWith:) | Apple Developer Documentation

Creates a new dictionary from the key-value pairs in the given sequence, using a combining closure to determine the value for any duplicate keys.

developer.apple.com


key와 value를 튜플로 넣어준 후, 클로저를 사용해 중복된 key의 value를 정해줍니다.

Dictionary(array.map { ($0, 1) }, uniquingKeysWith: +)와 같이 사용하였습니다.

그 이후, 가장 많이 출력된 값들만 남겨둔 후, key값을 기준으로 정렬해주었습니다.
1개라면 그대로 key를 출력해주고, 1개 이상이라면 1번 index의 key를 출력해주면 됩니다.

가장 큰 수 - 가장 작은 수를 해주면 범위를 구할 수 있습니다.

소스코드

후기

정렬을해야 풀 수 있는 문제입니다.
가장 까다로운 부분이 최빈값을 구하는 부분이라고 생각하는데, Dictionary의 개념을 이해하고 있다면 쉽게 풀 수 있습니다.

Dictionary의 생성자인 init(_:uniquingKeysWith:) 를 사용하지 않고, 수를 입력받을 때, Dictionary에 넣어주는 방식으로도 풀이할 수 있습니다.

반응형