본문 바로가기
Problem Solving/BOJ

백준 1764번 듣보잡 - 스위프트(Swift) 풀이

by 어멘드 2022. 1. 16.
반응형

 Set의 메소드들이 너무 잘 구현되어 있어서 거저먹을 수 있는 문제.

1. 듣도 못한 사람들로 Set<String>을 만든다.
2. 보도 못한 사람들로 Set<String>을 만든다.
3. 듣도 보도 못한 사람을 두 집합의 intersection(_:)으로 구한다.
4. 듣도 보도 못한 사람을 sorted()로 정렬해서 사전 순으로 출력한다.

1. 듣도 못한 사람들로 Set<String>을 만든다.

 이 문제는 교집합을 구하는 문제이다. 딕셔너리나 이분탐색으로 직접 교집합을 구할 수도 있겠지만, 스위프트의 Set에는 이미 intersection 메소드가 있으니 편하게 이걸 사용하기 위해서 Set으로 만들어준다.

 

2. 보도 못한 사람들로 Set<String>을 만든다.

  1번과 마찬가지로 M명을 입력으로 받아 하나의 Set으로 만들어준다.

 

3. 듣도 못한 사람들도 Set<String>을 만든다.

  Set에서 교집합을 구하는 함수 intersection(_:)을 써서 구하면 끝.

func intersection(_ other: Set<Element>) -> Set<Element>

let neverHeardAndSeen = neverHeard.intersection(neverSeen)

 

4. 듣도 보도 못한 사람을 sorted()로 정렬해서 사전 순으로 출력한다.

 Set에서도 sorted()가 제공돼서 사전순으로 출력하는 것도 문제없다. 개수는 count로 구하면 된다. N이 500,000이나 돼서 print()를 N번 호출하면 (안 해봤지만) 시간 초과가 날지도 모른다. 웬만하면 결과는 하나의 문자열로 만들어서 print는 1번만 해주자!

 


import Foundation

let input = readLine()!.split(separator: " ").map{ Int(String($0))! }
let N = input[0]
let M = input[1]

var neverHeard = Set<String>()
var neverSeen = Set<String>()

for _ in 0..<N {
    let name = readLine()!
    neverHeard.insert(name)
}

for _ in 0..<M {
    let name = readLine()!
    neverSeen.insert(name)
}

let neverHeardAndSeen = neverHeard.intersection(neverSeen)

var result = ""
result.write("\(neverHeardAndSeen.count)\n")
neverHeardAndSeen.sorted().forEach{ result.write("\($0)\n") }
print(result)
반응형

댓글