Where who wants to meet someone

백준 Swift [10816] 숫자 카드 2 본문

백준 알고리즘 문제 기록/집합과 맵

백준 Swift [10816] 숫자 카드 2

Lust3r 2023. 8. 11. 16:21
728x90

난이도

실버 IV

 

문제

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

 

10816번: 숫자 카드 2

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,0

www.acmicpc.net

 

내 답안

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

input.forEach { card in
    if cards[card] != nil {
        cards[card]! += 1
    } else {
        cards[card] = 1
    }
}

let m = Int(readLine()!)!
let tests = readLine()!.split(separator: " ").map { Int($0)! }

tests.forEach { test in
    cards[test] == nil ? print("0", terminator: " ") :
    print(cards[test]!, terminator: " ")
}

- 문제를 읽고, 갯수 카운팅이면 숫자와 갯수를 쌍으로 하는 딕셔너리를 사용하면 되겠다 생각이 들었고
  input값을 forEach로 돌면서 cards에 값이 없으면 1을 추가, 있으면 기존 값에 1을 더하는 식으로 처리를 했다.

  이후 검증해야 하는 test를 역시 forEach로 돌면서 없는 값이면 0을, 있는 값이면 그 값을 출력하는 방식으로 마무리 하였다.

 

- 처음에는 마지막 출력 부분에서 filter, value, first를 사용했는데 시간 초과가 났다. 이전 문제에서 해당 부분 또는 딕셔너리 저장하는 쪽에서 시간이 오래 걸린다는 것을 경험했기 때문에 그것을 수정하고자 했고, 이번에는 딕셔너리를 하나 더 추가하는 방식 대신 nil이면 0을, nil이 아니면 cards[test]를 통해 값을 추가하도록 변경하여 통과할 수 있었다.

- 딕셔너리의 값을 얻기 위해 그냥 dictionary[key] 를 하면 되는데 자꾸 dictionary.filter { $0.key == key }.values.first 를 무의식적으로 쓰는 것 같다.. 고칠 점!