[Swift 코테] 백준 2108 통계학
2022. 6. 2. 22:42ㆍSwift 코딩테스트/Swift 백준 문제 풀이
728x90
산술평균, 중앙값, 범위를 구하는 것은 모두에게 문제가 없을 것이라고 생각한다.
그래서 최빈값에 대해서만 적어보겠다.
처음엔 계수 정렬을 사용해서 최빈값을 따로 계산하려고 했는데 -> 음수를 고려해서 배열의 인덱스를 다시 설정해야 하는 번거로움이 있었다.
그래서 서치 결과 딕서너리의 활용법을 통해 문제를 풀 수 있었다.
1. 숫자를 입력받을 때 dictionary의 key값에 숫자를 value에 += 1을 해주는 방식으로 dictionary를 세팅한다.
let input = Int(readLine()!)!
var arr = [Int](repeating: 0, count: input)
var dict = [Int: Int]()
for i in 0..<input{
arr[i] = Int(readLine()!)!
dict[arr[i], default: 0] += 1
}
dictionary를 default값을 0으로 설정하고 += 1 하는 방법을 알게 되었다.
2. dictionary에서 key값(숫자)의 최대값이 아닌 value값(나온 횟수)의 최댓값을 찾아야 한다.
let max = dict.max(by: {$0.value < $1.value})!.value
3. 최빈값은 여러개일 수 있기 때문에 dictionary의 value(나온 횟수)의 최댓값을 max값과 비교해서
같은 것이 있다면 그 key값을 기준으로 정렬한다.
var mode = dict.filter {$0.value == max}.keys.sorted()
4. 문제에 주어진 조건에서 최댓값이 여러 개라면 key값 기준으로 두 번째로 작은 값을 출력하는 것이었다.
if mode.count > 1{
print(mode[1])
}else{
print(mode[0])
}
=> 이렇게 dictionary를 활용하는 방법을 알게되었다. 다음에 유용하게 써 보겠다.
//코드
let input = Int(readLine()!)!
var arr = [Int](repeating: 0, count: input)
var dict = [Int: Int]()
for i in 0..<input{
arr[i] = Int(readLine()!)!
dict[arr[i], default: 0] += 1
}
//평균
let avg = arr.reduce(0, {
(first: Int, second: Int) -> Int in
return first + second
})
print(Int(round(Double(avg) / Double(input))))
//중앙값
arr = arr.sorted()
print(arr[input/2])
//최빈값
let max = dict.max(by: {$0.value < $1.value})!.value
var mode = dict.filter {$0.value == max}.keys.sorted()
if mode.count > 1{
print(mode[1])
}else{
print(mode[0])
}
//범위
print(arr[input-1] - arr[0])
728x90
'Swift 코딩테스트 > Swift 백준 문제 풀이' 카테고리의 다른 글
[Swift 코테] 백준 1004 어린왕자 (0) | 2022.07.19 |
---|---|
[Swift 코테] 백준 2477 참외밭 (0) | 2022.07.17 |
[Swift 코테] 백준 10872 팩토리얼 (0) | 2022.04.26 |
[Swift 코테] 백준 1002 터렛 (0) | 2022.04.25 |
[Swift 코테] 백준 3053 택시 기하학 (0) | 2022.04.25 |