본문 바로가기
Problem Solving/BOJ

백준 1620번 나는야 포켓몬 마스터 이다솜 - 스위프트(Swift) 풀이

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

 문제가 엄청 엄청 긴데, 마지막 오박사 말만 읽으면 된다.

1. 이름을 보고 번호를 말하기 위해 Dictionary<String,Int>를 둔다.
2. 번호를 보고 이름을 말하기 위해 Dictionary<Int,String> 또는 Array<String>을 둔다.

1. 이름을 보고 번호를 말하기 위해 Dictionary<String, Int>를 둔다.

 N이 100,000이므로, 각 쿼리를 완전탐색으로 O(N)에 수행해서는 시간 안에 통과할 수 없다. Key가 포켓몬 이름이고 Value가 번호인 딕셔너리를 두어 O(1)에 각 쿼리를 완료해야 한다.

 

2.  번호를 보고 이름을 말하기 위해 Dictionary<Int, String> 또는 Array를 둔다.

 1번이랑 같은데, Key, Value 타입만 반대로 하면 된다. Key가 Int인 경우에는 배열을 subscript로 접근하는 거랑 똑같기 때문에 배열로도 가능하다. 딕셔너리로 시간 초과를 한번 경험해봤기 때문에 가능하다면 배열로 짜는 습관을 가지게 돼서 이 문제도 배열로 풀었다.

 


import Foundation

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

var numToString = Array(repeating: "", count: 100001)
var stringToNum: Dictionary<String, Int> = [:]

for i in 1...N {
    let pokemon = readLine()!
    numToString[i] = pokemon
    stringToNum[pokemon] = i
}

var result = ""

for _ in 1...M {
    let query = readLine()!
    let num = Int(query) ?? 0
    if num == 0 {
        result.write("\(stringToNum[query]!)\n")
    } else {
        result.write("\(numToString[num])\n")
    }
}

print(result)

 

반응형

댓글