본문 바로가기
프로그래머스 Algorithm

[프로그래머스] 가장 가까운 같은 글자 Kotlin

by Echung 2023. 12. 13.

안녕하세요. 이번에는 프로그래머스 정수 내림차순으로 배치하기를 풀어보려고 합니다.

 

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

 

프로그래머스

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

programmers.co.kr


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은 영어 소문자로만 이루어져 있습니다.
사진 1. 입출력 예

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. 다른 사람 코드

 

반응형