Where who wants to meet someone

백준 Swift [18870] 좌표 압축 본문

백준 알고리즘 문제 기록/정렬

백준 Swift [18870] 좌표 압축

Lust3r 2023. 8. 7. 14:39
728x90

난이도

실버 II

 

문제

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

 

18870번: 좌표 압축

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다. X1, X2, ..., XN에

www.acmicpc.net

 

내 답안

let n = Int(readLine()!)!
var arr = readLine()!.split(separator: " ").map { Int($0)! }
var dictionary = [Int:Int]()
var count = 0

for i in arr.sorted() {
    if dictionary[i] == nil {
        dictionary[i] = count
        count += 1
    }
}

print(arr.map { String(dictionary[$0]!) }.joined(separator: " "))

- 처음에는 forEach와 if문을 통해 구성하였으나 시간 초과가 났다.

- dictionary를 사용하는 방법을 적용하여 해결할 수 있었다.

 

- arr.sorted를 통해 숫자가 작은 것부터 순차적으로 정렬이 되는데, 그것을 가지고 dictionary에 해당 키가 없으면 count를 값으로 넣어주는 방식이다.

맨 첫번째 값은 어차피 더 작은(이전의) 값이 없기 때문에 0으로 시작, 다음 차례로 갈 수록 이전의 값이 생기므로 +1씩 해주는 방식이다.

이후 출력은 dictionary의 $0 값을 map을 통해 배열로 만들고 그것을 공백을 주어 joined한 것을 출력하며 마무리했다.