2023-08-02

Owler·2023년 8월 3일
0

이어서.. 기술한다.

알고리즘

코틀린에서 배열이 주어졌을 때 숫자만 골라서 오름차순으로 정리하기

처음 봤을때 든 생각은 배열에 숫자와 문자가 섞였을 때 어떻게 하면 숫자만 골라내지 였다.
알고 있는 상식에서는 또 반복문을 돌려서 하나하나 숫자인지 문자열인지 비교해보고 숫자만 골라내서 새로운 배열에 넣는 방식을 생각해봤는데, 어제 경험에서 비롯되어 내가 생각하고 있는 풀보다 코틀린에서 제공하는 다양한 함수를 이용하면 생각보다 더 간단하게 할 수 있지 않을까 라는 생각에, 구글링을 통해 지식을 얻어보았다.

이것을 역으로 이용한다면 문자를 제외하고 숫자만 뽑아낼 수 있을 것 같다는 생각이 들었다.

class Solution {
    fun solution(my_string: String): IntArray {
         
    val intArray: IntArray
    
    intArray = my_string.filterIsInstance<Int>().filter {
        it.sorted()
    }
        
    var answer: IntArray = intArray
    return answer
    }
}

내 머릿속에서는 정수형 리스트 intArray를 선언 한 뒤
위에서 찾은 함수로 정수형 변수들만 뽑아서 sorted함수로 오름차순으로 정렬하려 했지만
오류가 발생했다..

역시 모르는 부분을 다시 구글링 해보니 filter함수 안에서 it을 sorted로 정리 할수 없다고 나왔다. 또한 FilterIsInstance 는 <>안의 변수형으로 전환할 수 없는 문자열이 들어오면 오류가 발생한다고 한다.

해서 다른 방법을 고안해보았다. 예제에서 주어지는 "hi12392" 배열을 문자 하나씩 비교해 본 뒤 문자인 경우를 제외 하고 정수형인 경우만 뽑아내서 새로운 리스트를 만드는 것이다.(뭔가 처음으로 돌아간 느낌이었다.. 노가다 하기 싫었는데 하는 느낌?)

class Solution {
    fun solution(my_string: String): IntArray {
         
    val intArray = mutableListOf<Int>()
    
    for(char in my_string){
        if(char.isDigit()){
            intArray.add(char.toString().toInt())
        }
    }
    
    val answer = intArray.sorted().toIntArray()
    
    return answer
    }
}

먼저 새로운 빈 배열을 자유롭게 변형가능한 mutableListOf 함수로 만들어 준다.
그 다음 문자열 속 문자 하나하나 비교해보고 숫자일 경우/isDigit()/ 아까 만든 배열에 추가한다.
마지막으로 만든 배열속 숫자들을 오름차순으로 정리한다/sorted()/

새로 알게 된점

  1. filter 함수 사용법
  2. isDigit 함수 사용법
  3. 반복문 안 문자 비교법
  4. sorted 함수 사용법

느낀점

기존에 가지고 있던 상식들은 대부분 노가다를 통한 해결이었는데 코틀린은 생각보다 이런 노가다를 줄여주는 편리한 함수들을 많이 가지고 있다는 것을 알게 되었다.

동시에 이런 의문이 들었다. 기존에 가지고 있던 방식들이 다 노가다를 베이스로 한다면 노베이스에서 시작하는 지금 먼저 함수들을 공부하고 시작하는 것이 좋을 지 아니면 노가다를 해결해 주는 함수를 찾고 시작해도 되는지, 함수들을 찾고 시작한다는 것이 스스로 고민을 해보지 않는 것이 되버리는지에 대 한 의문이 들었다.

profile
junior_developer

0개의 댓글