문자열 s
가 주어졌을 때, s
의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
예를 들어, s
="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.
따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.
문자열 s
이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.
s
의 길이 ≤ 10,000s
은 영어 소문자로만 이루어져 있습니다.최종 코드
class Solution {
fun solution(s: String): MutableList<Int> {
var answer = mutableListOf<Int>()
var sList = s.trim().toList()
var validList = mutableListOf<Char>()
var validIndex : Int = 0
for(index in 0 .. sList.size-1){
if(validList.isEmpty()){
validList.add(sList[index])
answer.add(-1)
}else{
if(validList.contains(sList[index])){
validIndex = validList.lastIndexOf(sList[index])
answer.add(index-validIndex)
validList.add(sList[index])
}else{
answer.add(-1)
validList.add(sList[index])
}
}
}
return answer
}
}
풀이 과정
validList라는 mutableList를 만들어서
sList의 인덱스를 하나씩 검사할때마다 검사한 애를 넣어주고,
만약에 validList에 sList지금 검사하는 애가 이미 들어있으면, 그 친구의 가장 마지막 인덱스를 찾아와서
answer에 넣어주는 식?
class Solution {
fun solution(s: String): List<Int> {
return s.withIndex().map { (i, c) -> s.slice(0 until i).lastIndexOf(c).let { if (it >= 0) i - it else -1 } }
}
}
또 대다식이야..(람다식이라는뜻)난 모른척할 수밖에 없어..
람다식 빨리 공부해야되는데,, 나중에 람다식 공부해서 이해다하고 나면 이게 바로 읽힐까?ㅜ
class Solution {
fun solution(s: String): IntArray {
val answer = IntArray(s.length) {-1}
val checkIndex = ('a'..'z').associate { it to -1 } as HashMap
s.forEachIndexed { i, v ->
if (checkIndex[v]!! > -1) answer[i] = (i - checkIndex[v]!!)
checkIndex[v] = i
}
return answer
}
}