[백준 1620] 코틀린 HashMap에서 Value로 Key찾기
2021. 2. 1. 21:02
반응형
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)
}
반응형
'프로그래밍 > 안드로이드+코틀린' 카테고리의 다른 글
안드로이드 앱 빌드 오류 (1) | 2021.02.07 |
---|---|
코틀린으로 알고리즘 풀 때 기본 팁 (0) | 2021.02.04 |
코틀린 물음표와 느낌표 (0) | 2021.01.31 |
안드로이드 볼륨키 클릭 이벤트 관리 (0) | 2021.01.29 |
안드로이드 suspendCoroutine를 통해 Firebase 이용하기 (0) | 2021.01.28 |