티스토리 뷰

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

 

1620번: 나는야 포켓몬 마스터 이다솜

첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면

www.acmicpc.net

제목부터 킹받는 문제다

지하철에서 문제를 열심히 읽었는데 본문 전체가 문제 푸는데에는 영향을 주지 않는 빌드업이었다 ^_^

 

문제를 읽기 전에 이 블로그를 먼저 보는 사람은 없겠지만

혹시 운 좋은 어떤 사람이 문제도 보기 전에 이 블로그를 먼저 봤다면

문제 설명 부분에서

오박사 : 그럼 다솜아 이제 진정한 포켓몬 마스터가 되기 위해 도감을 완성시키도록 하여라. 일단 네가 현재 가지고 있는 포켓몬 도감에서 포켓몬의 이름을 보면 포켓몬의 번호를 말하거나, 포켓몬의 번호를 보면 포켓몬의 이름을 말하는 연습을 하도록 하여라. 나의 시험을 통과하면, 내가 새로 만든 도감을 주도록 하겠네.

딱 이 부분만 보면 된다

너무 오랜만에 쓰다보니 잡담이 길었다!

---

문제는 도감에 수록되어있는 N개의 포켓몬 이름이 입력으로 주어진다.

그리고 M개의 문제가 주어지는데 문제는 (도감에 있는) 포켓몬의 이름이거나 도감에 저장된 포켓몬의 번호(인덱스) 중 하나이다.

즉, 이름이 나오면 숫자를 말하고, 번호가 나오면 이름을 말하면 되는 문제

 

접근방법

 

번호 -> 이름 유형의 문제는 배열에 담아두면 O(1)만에 말할 수 있지만

이름 -> 번호 유형의 문제는 hash map을 사용해서 풀이해야하는 문제이다.

 

swift에서 hash map을 사용하는 자료구조는 dictionary가 있다.

따라서 [String:Int]인 딕셔너리를 사용했다.

 

*

그리고 문제를 입력받을 때 숫자인지 이름인지 구분해야 하는데,

swift String의 allSatisfy 메서드를 이용했다. (allSatisfy 메서드는 문자열의 모든 문자가 allSatisfy 메서드의 매개변수로 전달되는 Predicate 클로저에 대해 모두 참이면 true, 하나라도 false이면 false를 반환하는 메서드이다.)

 

소스코드

import Foundation

let inputs = readLine()?.split(separator: " ")
let N:Int = Int(inputs![0])!
let M:Int = Int(inputs![1])!

var dic:[String:Int] = [:]
var arr:[String] = Array(repeating: "", count: N+1)
for i in 1...N {
    let name:String = readLine()!
    dic[name] = i
    arr[i] = name
}

for _ in 1...M {
    let query:String = readLine()!
    if query.allSatisfy{ $0.isNumber } {
        let idx:Int = Int(query)!
        print(arr[idx])
    } else {
        print(dic[query]!)
    }
}
댓글
댓글쓰기 폼