728x90
평균, 중간값, 빈도수, 범위 네 가지를 구해주면 되는 문제이다.
평균, 중간값, 범위 까지는 간단했는데.. 빈도수를 구하는데 조금 시간이 걸렸다.
근데 그냥 생각나는대로 코드를 짰더니 코드가 엄청 덕지 덕지 만들어졌다 ㅠㅠ
이 문제를 풀면서 생각한 논리적 흐름은
- 평균 -> 입력받은 값들을 전부 더한 뒤 N으로 나눈다.
- 중간값 -> 배열을 정렬해준뒤, N을 2로 나누고 소수점을 버린 위치가 항상 중간값이다.(홀수 N만 입력받기 때문에)
- 빈도 -> 딕셔너리를 만들고 딕셔너리 내의 key와 value 값을 비교해 max value를 구해준다.
- 빈도 -> max value와 dict 내의 element가 같을 경우 mode 배열에 값을 추가해준다.
- 빈도 -> mode 배열 내의 값이 1개 초과인 경우 겹치는 max value가 있는 것이기 때문에 두 번째 인자 값을 출력해준다.
- 빈도 -> mode 배열 내의 값이 1개인 경우 겹치는 max value가 없기 때문에 mode 인자값을 출력해준다.
- 범위 -> 배열을 정렬하고 가장 작은 값과 가장 큰 값의 차를 절대값으로 계산해준다.
* 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)
- 없음
'TIL > 알고리즘 공부' 카테고리의 다른 글
백준 11650번 Swift 알고리즘 연습 (0) | 2022.09.10 |
---|---|
백준 1427번 Swift 알고리즘 연습 (0) | 2022.09.10 |
백준 25305번 Swift 알고리즘 연습 (1) | 2022.09.10 |
백준 2751번 Swift 알고리즘 연습 (0) | 2022.09.10 |
백준 2750번 Swift 알고리즘 연습 (0) | 2022.09.10 |