본문 바로가기
Algorithm/BOJ

[Algorithm/BOJ] 2910 - 빈도 정렬 Swift

by thoonk: 2021. 7. 1.

문제풀이: 

처음에 딕셔너리를 쓰지 않고 0 ~ c+1 까지 개수의 배열을 만들어 정렬시켰다.

하지만 메모리 초과로 인해 런타임 에러가 발생했고 딕셔너리를 통해 해결했다.

딕셔너리의 해당 숫자에 따른 빈도와 순서 정보를 저장했다.

숫자, 빈도, 순서 정보를 배열에 할당해서 빈도가 같으면 순서가 빠른 순서, 같지 않다면 빈도가 많은 순서로 정렬시켰다.

 

코드: 

// fq: 빈도, v: 값, s: 순서
typealias Count = (fq: Int, v: Int, s: Int)

let input = readLine()!.split(separator: " ").map { Int(String($0))! }
let n = input[0]
let c = input[1]
var nums = readLine()!.split(separator: " ").map { Int(String($0))! }
var counter = [Int: [Int]]() // value의 [0]: 빈도, [1]: 순서

var i = 0
nums.forEach {
    if counter.keys.contains($0) {
        counter[$0]![0] += 1
    } else {
        counter[$0] = [1, i]
        i += 1
    }
}

var resultNums = [Count]()
var res = ""

for i in counter {
    resultNums.append((i.value[0], i.key, i.value[1]))
}

resultNums.sort { $0.fq == $1.fq ? $0.s < $1.s : $0.fq > $1.fq }
resultNums.forEach {
    res += String(repeating: "\($0.v) ", count: $0.fq)
}

print(res)

 

문제:

 

2910번: 빈도 정렬

첫째 줄에 메시지의 길이 N과 C가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ C ≤ 1,000,000,000) 둘째 줄에 메시지 수열이 주어진다.

www.acmicpc.net

댓글