[백준] 애너그램 거리 (3778)(kotlin)
문제 설명
입력 및 출력
» 입력
- 첫째 줄에 테스트 케이스의 개수 N이 주어진다. N은 60,000보다 작거나 같은 자연수이다. 각 테스트 케이스는 두 줄로 이루어져 있고, 한 줄에 단어가 하나씩 주어진다. 단어의 길이는 0일 수도 있고, 알파벳 소문자로만 이루어져 있다. 단어는 실제로 영어 사전에 있는 단어만 주어지며, 영어 사전에서 가장 긴 단어는 pneumonoultramicroscopicsilicovolcanoconiosis이다.
» 출력
각 테스트 케이스에 대해서 케이스 번호와 입력으로 주어진 두 단어의 애너그램 거리를 출력한다.
예제 입출력(테스트케이스)
입력 | 출력 |
---|---|
4 crocus succor dares seared empty smell lemon |
Case #1: 0 Case #2: 1 Case #3: 5 Case #4: 4 |
문제 풀이1
import kotlin.math.max
fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
repeat(readLine().toInt()) {
val a = readLine()
val b = readLine()
if (a.isNullOrBlank() || b.isNullOrBlank()) max(a.length, b.length)
var aArr = IntArray(26) { 0 }
var bArr = IntArray(26) { 0 }
for (i in a) aArr[i - 'a']++
for (i in b) bArr[i - 'a']++
println("Case #${it + 1}: ${anagram(aArr, bArr)}")
}
}
fun anagram(lhs: IntArray, rhs: IntArray): Int {
var cnt = 0
lhs.forEachIndexed { index, int ->
if (int > rhs[index]) {
val diff = int - rhs[index]
rhs[index] -= diff
cnt += diff
}
else if (int < rhs[index]) {
val diff = rhs[index] - int
lhs[index] -= diff
cnt += diff
}
}
return cnt
}
문제 풀이2
import kotlin.math.abs
fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
repeat(readLine().toInt()) { case ->
val a = readLine()
val b = readLine()
var anagram = if (!a.isNullOrBlank() || !b.isNullOrBlank()) {
var arr = IntArray(26) { 0 }
for (i in a) arr[i - 'a']++
for (i in b) arr[i - 'a']--
arr.sumOf { abs(it) }
} else if (a.length > b.length) a.length
else b.length
println("Case #${case + 1}: $anagram")
}
}