안녕하세요. 이번에는 프로그래머스 정수 내림차순으로 배치하기를 풀어보려고 합니다.
https://school.programmers.co.kr/learn/courses/30/lessons/12933
Problem
문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
예를 들어, s="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.
- b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
- a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
- n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
- a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다.
- n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다.
- a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 중 가까운 것은 두 칸 앞이고, 이는 2로 표현합니다.
따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.
문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해 주세요.
[제한 사항]
○ 1 ≤ s의 길이 ≤ 10,000
- s은 영어 소문자로만 이루어져 있습니다.
Solution
class Solution {
fun solution(s: String): IntArray {
var answer: IntArray = intArrayOf()
var hashMap = HashMap<Char, Int>()
var length: Int = 0
s.forEachIndexed {
index, c ->
if(hashMap.containsKey(c)) {
length = index - hashMap.get(c)!!.toInt()
answer += length
} else {
answer += -1
}
hashMap.put(c, index)
}
return answer
}
}
이번 문제는 HashMap을 사용해서 문제를 해결해 보았습니다. hashMap에 key와 value를 저장하면서 key는 각 위치의 글자가 되고 value는 index의 값을 넣어주면서 문제를 해결할 수 있었습니다.
1. 다른 사람 코드
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 } }
}
}
저의 코드와 다르게 코틀린 문법을 잘 활용해서 1줄로 푼 문제가 있어서 공부용으로 가져와보았습니다.
코드 분석
// withIndex를 사용하면 객체의 원소를(index, value)로 접근할 수 있도록 만들어 줍니다.
s.withIndex()
// map함수를 통해서 list<R>함수로 반환시키면서 withIndex를 순환합니다
map { (index, c) -> s.slice(0 until index).lastIndexOf(c).let { if (it >= 0) index - it else -1 } }
여기서 slice 함수를 사용해서 index로 자릅니다.
그리고 lastIndexOf 함수를 사용해서 c의 값의 마지막 위치를 구하고
만약 마지막 위치가 있으면 그 index - 그 위치를 , 없으면 -1로 만들어줍니다.
이렇게 코틀린 코드를 사용하면 가독성 좋게 코드를 작성할 수 있습니다. 저 코드에서 굳이 withIndex가 아닌 mapIndexed를 사용해도 문제를 풀 수 있습니다.
class Solution {
fun solution(s: String): List<Int> {
return s.mapIndexed { i, c -> s.slice(0 until i).lastIndexOf(c).let { if (it >= 0) i - it else -1 } }
}
}
둘 모두 같은 결과를 나타내주는 코드이니 자신의 스타일에 따라서 코드를 작성하시면 될 것 같습니다. 코드에는 정답이 없고 자신이 편하고 상대방이 쉽게 이해할 수 있는 코드면 저는 다 괜찮다고 생각합니다.
Performance
1. 내가 작성한 코드 | 2. 다른 사람 코드 |
'프로그래머스 Algorithm' 카테고리의 다른 글
[프로그래머스] 문자열 내 마음대로 정렬하기 Kotlin (2) | 2023.12.15 |
---|---|
[프로그래머스] K번째 수 Kotlin (0) | 2023.12.14 |
[프로그래머스] 숫자 문자열과 영단어 Kotlin (0) | 2023.12.12 |
[프로그래머스] 카펫 Kotlin (0) | 2023.12.11 |
[프로그래머스] 최소직사각형 Kotlin (0) | 2023.12.10 |