반응형
val hm = HashMap<Int, String>()
hm.filterValues { it == input }.keys

filterValues를 이용하여 Value로 Key를 찾을 수 있다.

 

백준 1620번은 이름이 입력되면 몇 번째 이름인지 출력하고, 숫자가 입력되면 숫자에 입력된 이름을 출력해야 하는 것이었는데, HashMap을 이용하면 쉽게 풀릴 것이라 생각했다.

 

사실은 그렇지 않았다. 

filterValues를 이용하니 시간초과가 나왔다. 이럴 줄 알았으면 filterValues 코드 한 번이라도 보고 실행해볼걸 이라고 생각하며, filterValues 코드를 확인해보았다.

 

public inline fun <K, V> Map<out K, V>.filterValues(predicate: (V) -> Boolean): Map<K, V> {
    val result = LinkedHashMap<K, V>()
    for (entry in this) {
        if (predicate(entry.value)) {
            result.put(entry.key, entry.value)
        }
    }
    return result
}

for문으로 value값을 비교해가며 값을 찾는 방식이었다. 이러면 시간 초과가 나올 수밖에 없을 것이다.

 

그러므로 그냥 아래 코드처럼 풀면 된다. 어렵지 않으니 그냥 보면 이해가 될 것 같다.

혹시 이해가 안되는 분이 계시다면 댓글을 달아주세요.

import java.io.BufferedReader
import java.io.InputStreamReader
import java.lang.Exception
import java.lang.StringBuilder

fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val (a, b) = br.readLine().toString().split(' ')
    val n = a.toInt()
    val k = b.toInt()
    val arr = mutableListOf<String>()
    val hm = HashMap<String, Int>()
    var sb = StringBuilder()
    for (i in 0 until n) {
        val name = br.readLine().toString()
        arr.add(name)
        hm[name] = i
    }
    for (i in 0 until k) {
        val input = br.readLine()
        try {
            if (input.toInt() in 1..100004) { // 만약 숫자가 입력되었다면
                sb.append("${arr[input.toInt() - 1]}\n")
            }
        } catch (e : Exception) { // 만약 문자라면
            sb.append("${hm[input]!!+1}\n")
            //sb.append("${hm.filterValues { it == input }.keys.sum() + 1}\n")
        }
    }
    println(sb)
}

 

반응형

+ Recent posts