[백준] 애너그램 거리 (3778)(kotlin)

문제 설명

백준 3778번 문제 링크

입력 및 출력

» 입력

  • 첫째 줄에 테스트 케이스의 개수 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")
    }
}