🕵️문제설명

두 정수 X, Y의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다(단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다). X, Y의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. X, Y의 짝꿍이 0으로만 구성되어 있다면, 짝꿍은 0입니다.

예를 들어, X = 3403이고 Y = 13203이라면, X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 3, 0, 3으로 만들 수 있는 가장 큰 정수인 330입니다. 다른 예시로 X = 5525이고 Y = 1255이면 X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 2, 5, 5로 만들 수 있는 가장 큰 정수인 552입니다(X에는 5가 3개, Y에는 5가 2개 나타나므로 남는 5 한 개는 짝 지을 수 없습니다.)
두 정수 X, Y가 주어졌을 때, X, Y의 짝꿍을 return하는 solution 함수를 완성해주세요

⚠️제한사항

3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000입니다.
X, Y는 0으로 시작하지 않습니다.
X, Y의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.

🔎로직설명

fun solution(X: String, Y: String):String{
        var x = IntArray(10) // 0~9까지의 숫자의 갯수를 담당할 배열
        var y = IntArray(10)

        X.forEach { x[it - '0']++ } // 각각 index에 X의 요소가 같은값이면 카운트 해준다
        Y.forEach { y[it - '0']++ }

        val answer = StringBuilder()
        for (i in 9 downTo 1) {
            var a = minOf(x[i], y[i])
            answer.append(i.toString().repeat(a))
        }
        val a = minOf(x[0], y[0])
        if (answer.isEmpty() && a > 0) answer.append(0) else answer.append(0.toString().repeat(a))
        return if (answer.isEmpty()) "-1" else answer.toString()
    }

그냥 하던대로 X.forEach { Y.forEach 이런식으로 하려했으나

문자열의 길이 제한이 3000000으로 매우 큰대

시간복잡도가 O(n^2)이니 연산시간이 매우 오래 걸린다

X와 Y의 수를 따로 카운팅해서 시간 복잡도가 O(2n)인 코드를 짜 연산시간을 확 줄였다

크기가 10인 배열을 만들고

0~9까지의 위치값과 같은 숫자가 X에 있으면 카운팅하게 만들었다

그럼에도 불구하고 연산이 되게 오래 걸려서

answer를 StringBuilder클래스로 정의하고 append로 숫자들을 받았으며

중복되는 숫자가 0뿐인데 복수이면 00 이런식으로 나오기 때문에 조건문으로 예방했다

0개의 댓글