https://school.programmers.co.kr/learn/courses/30/lessons/160586
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
class Solution {
fun solution(keymap: Array<String>, targets: Array<String>): IntArray =
targets.map { str ->
str.map { c -> keymap.map { it.indexOf(c) + 1 }
.filterNot { it < 1 }
.let { list ->
if (list.isEmpty()) -1
else list.minOf { it }
}
}.let { if ( it.contains(-1)) -1 else it.sum() }
}.toIntArray()
}
좋은 코드를 짜려면 좋은 코드를 많이 보라는 말에 따라 오늘부터 코틀린스러운 문제 해결법에 집중해서 다른 분의 코드를 분석하고 내 것으로 만드는 과정을 시작해보려 한다. 위 코드를 통해 코틀린의 각종 확장함수와 함수 표현식을 알 수 있다.
위의 코드는 프로그래머스 최용건님의 코드이다. 안에 내용을 안과 밖을 구분해서 분석해보자.
targets.map { str ->
str.map { c -> keymap.map { it.indexOf(c) + 1 }
.filterNot { it < 1 }
.let { list ->
if (list.isEmpty()) -1
else list.minOf { it }
}
분석해보자면 .map으로 타겟 배열을 스트링 그리고 문자로 나눠서 그 문자가 keymap배열의 몇번째 인덱스에 있는지 확인한다.
이 후 .filterNot을 통해 인덱스가 1보다 작은 것들은 빼고 배열형태로 반환한다.
그리고 리스트안에 만약 문자가 없으면 -1 을 보내고 여러개 있는데 그 중 우리는 최솟값을 찾는 것이기에 minOf를 통해 작은 값을 보낸다.
targets.map { str ->
...
}.let{ if(it.contains(-1)) -1 else it.sum() }
나온 리스트안에 -1이 포함되어있으면 -1을 내보내고 아니라면 리스트안에 원소들을 모두 .sum()을 통해 합한다.
내가 생각하기엔 코틀린스럽다는 말이 이제 조금 와닿고 있다. 아무래도 이 문제에 최적화된 코드는 아니지만 문제가 좀 더 꼬여있을 때를 생각하면 좀 더 확장성 있게 잘 짠 코드인 것 같다.
'Code KATA' 카테고리의 다른 글
Programmers 햄버거 만들기 with Kotlin (0) | 2023.12.20 |
---|---|
Programmers 둘만의 암호 with Kotlin (1) | 2023.12.19 |
Programmers 문자열 나누기 with Kotlin (0) | 2023.12.15 |
Programmers 체육복 with Kotlin (0) | 2023.12.14 |
Programmers 숫자 짝꿍 with Kotlin (0) | 2023.12.13 |