https://school.programmers.co.kr/learn/courses/30/lessons/131128

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

이번 문제는 풀지 못했다... 가면 갈수록 어려워지고 있다. 다른 분의 코드를 보면서도 이해가 가지 않아 분석을 하면서 공부를하고 실력을 키우는 방향으로 잡았다.

 

import kotlin.math.min

class Solution {
    fun solution(X: String, Y: String): String {
        var answer: String = ""

        for (ch in (9 downTo 0).toList().map { it.toString() }) {
            answer += ch.repeat(
            min(
            	X.count { it.toString() == ch },
            	Y.count { it.toString() == ch }
               	)
           )
        }
        if (answer.isEmpty()) answer = "-1"
        if (answer.toList().distinct() == listOf('0')) answer = "0"

        return answer
    }
}

 

우선 이 코드의 방식은 9 부터 0 까지의 숫자로 X와 Y에서 등장하는 횟수를 구한 뒤 둘의 최솟값으로 반환하여 answer에 넣어주는 방식이다.

 

이제 한줄 한줄 분석해보자.

 

더보기

for (ch in (9 downTo 0).toList().map { it.toString() })

 

여기서는 9 downTo 0 을 통해 9 8 7 6 5 4 3 2 1의 범위를 가져오고

 

이 숫자들을 toList()를 통해 리스트 형태인 [ 9, 8, 7, 6, 5, 4, 3, 2, 1 ] 이 형식으로 만들어준다.

 

이후 X와 Y의 문자열 형태와 비교시켜주기 위해 .map{it.toString()} 각각의 숫자를 문자열형태로 변환해준다.

-> ['9', '8', '7', '6', '5', '4', '3', '2', '1', '0']

 

그리고 각 문자열 '9', '8', '7', '6', '5', '4', '3', '2', '1', '0' 을 차례대로 ch에 담아 준다.

더보기

answer += ch.repeat(코드내용)

여기가 처음 의아했던 부분이었다.

ch.repeat(n)은 앞에 변수인 ch를 n번 반복시켜주는 함수다.

이를 통해 repeat안에는 Int값이 들어올 것임을 알 수 있다.

아무튼 9부터 시작하여 0의 문자를 들어오는 정수 값에 따라 여러번 Answer에 넣어줄 수 있게 만들어주고 있다.

나머지는 뒤에 코드를 같이 보며 설명하겠다.

더보기

 

ch.repeat(min(X.count { it.toString() == ch }, Y.count { it.toString() == ch }))

 min() 함수는 ()안에 두 값을 비교해 최소값을 반환해주는 함수이다.

 중요한 건 그 안에 내용이다.

X.count{it.toString() == ch} Y.count{it.toString() == ch}

실제 함수가 돌아가는 예를 보자, X 가 "5525" Y가 "1255" 

처음 ch인 '9'가 들어온다. 그리고 X와 Y의 문자열을 순회하며 '9'와 같은 값이라면 카운트를 해주는 것이다.

X와 Y모두 '9', '8', '7', '6' 을 가지고 있지 않으므로 위의 ch.repeat에서 '9', '8', '7', '6' 은 들어가지 않는다.

하지만 '5' 차례일 때 부터는 다르다. X에서는 '5'가 3번이나 들어가고 Y는 2번 들어간다. 우리는 짝꿍일 경우에만 넣어주기에 2개만 넣어주어야 한다. 그걸 위해 min 함수를 통해 둘의 최소값인 Ycount=2를 반환해주는 것이다.

여기서 it.toString은 ch와 비교연산을 위해 타입을 맞춰주는 것이다. (원래 it 은char타입임)

더보기

        if (answer.isEmpty()) answer = "-1"
        if (answer.toList().distinct() == listOf('0')) answer = "0"

이 후 맞는 숫자가 없을 경우에는 answer에 어떤 ch도 들어가지 않기에 비어있으므로 -1 을 반환

그리고 X 가 "100" Y가 "10025"  와 같이 answer에 '0' 값이 두번 이상 있는 경우에 대비해 .distinct()로 중복을 제거해준 후 '0'만 있다면 answer에 '0'을 반환해주는 처리를 해준다. 

 

 

 

+ Recent posts