문제
https://www.acmicpc.net/problem/2108
풀이
수를 입력받아서 산술평균, 중앙값, 최빈값, 범위를 구하는 문제입니다.
먼저 입력받은 수를 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:)
key와 value를 튜플로 넣어준 후, 클로저를 사용해 중복된 key의 value를 정해줍니다.
Dictionary(array.map { ($0, 1) }, uniquingKeysWith: +)
와 같이 사용하였습니다.
그 이후, 가장 많이 출력된 값들만 남겨둔 후, key값을 기준으로 정렬해주었습니다.
1개라면 그대로 key를 출력해주고, 1개 이상이라면 1번 index의 key를 출력해주면 됩니다.
가장 큰 수 - 가장 작은 수를 해주면 범위를 구할 수 있습니다.
소스코드
후기
정렬을해야 풀 수 있는 문제입니다.
가장 까다로운 부분이 최빈값을 구하는 부분이라고 생각하는데, Dictionary의 개념을 이해하고 있다면 쉽게 풀 수 있습니다.
Dictionary의 생성자인 init(_:uniquingKeysWith:) 를 사용하지 않고, 수를 입력받을 때, Dictionary에 넣어주는 방식으로도 풀이할 수 있습니다.
'PS > 백준' 카테고리의 다른 글
[BOJ] 백준 11650 좌표 정렬하기 (Swift) (0) | 2023.03.08 |
---|---|
[BOJ] 백준 1427 소트인사이드 (Swift) (0) | 2023.03.08 |
[BOJ] 백준 10989 수 정렬하기 3 (Swift) (1) | 2023.03.07 |
[BOJ] 백준 2571 수 정렬하기 2 (Swift) (0) | 2023.03.07 |
[BOJ] 백준 25305 커트라인 (Swift) (0) | 2023.03.07 |