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'을 반환해주는 처리를 해준다.
'Code KATA' 카테고리의 다른 글
Programmers 문자열 나누기 with Kotlin (0) | 2023.12.15 |
---|---|
Programmers 체육복 with Kotlin (0) | 2023.12.14 |
Programmers 옹알이 (2) with Kotlin (1) | 2023.12.12 |
Programmers 로또의 최고 순위와 최저 순위 with Kotlin (0) | 2023.12.11 |
Programmers 기사단원의 무기 with Kotlin (0) | 2023.12.08 |