알고리즘 CODEKATA 25 (나누어 떨어지는 숫자 배열)

오리너구리·2024년 6월 1일
0

CODEKATA

목록 보기
25/57
post-thumbnail

문제 설명

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.

divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.


제한사항

  • arr은 자연수를 담은 배열입니다.
  • 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
  • divisor는 자연수입니다.
  • array는 길이 1 이상인 배열입니다.

내 풀이

최종 코드

class Solution {
    fun solution(arr: IntArray, divisor: Int): IntArray {

        var count = 0

       for(num in arr){
           if (num % divisor == 0){
               count ++
           }
       }

       if(count ==0)
        {
            return intArrayOf(-1)
        }

        val answer = IntArray(count)
        var index = 0 

        for (num in arr) {
            if(num % divisor == 0){
                answer[index++] = num
            }
        }

        return answer.sortedArray()

    }
}

풀이 과정

class Solution {
    fun solution(arr: IntArray, divisor: Int): IntArray {
        var answer = intArrayOf()
        var index = 0
        var element = arr.toString().toInt()
        
        
        for(i in element.indices){
            if(i % divisor ==0){
                answer[index] = i   
                index ++
            
            }
        }
        
        
        println(answer)
        
        return answer
    }
}

흠 배열에 있는 수를 조건으로 판별해야하는데,

생각나는 대로 일단

for 문으로 i가 element의 요소 일때 i를 디바이저로 나누어서 떨어지면, answer 배열에 저장할까 했는데 문법적으로 마구 틀려버린듯?

class Solution {
    fun solution(arr: IntArray, divisor: Int): IntArray {

        var count = 0

       for(num in arr){
           if (num % divisor == 0){
               count ++
           }
       }

       if(count ==0)
        {
            return intArrayOf(-1)
        }

        val answer = IntArray(count)
        var index = 0 

        for (num in arr) {
            if(num % divisor == 0){
                answer[index++] = num
            }
        }

        return answer.sortedArray()

    }
}

index 도 반복할 때마다 올라가야해서

for문으로 count 숫자를 세줌

만약에 요소 중에 divisor로 나누어 떨어지는 요소가 하나도 없으면 -1 을 리턴하고,

answer를 count만큼의 크기인 IntArray로 할당하고,

divisor로 나누어떨어지는 요소를 answer 배열에 넣어줌.

마지막으로 answer를 return 할 때 .sortedArray()로 정렬해주면 된다~


다른 풀이

class Solution {
    fun solution(arr: IntArray, divisor: Int): IntArray {
        var answer = arr.filter{it % divisor ==0}.toIntArray()
       
       return if (answer.isEmpty()) intArrayOf(-1) else answer.sortedArray()
       
        return answer
    }
}

.filter와 isEmpty 함수를 사용하면 좀 더 간단하게 풀 수 있었다.

근데 .filter를 아직 공부못해서 생각 못했다.

class Solution {
    fun solution(arr: IntArray, divisor: Int): IntArray {
        var answer = intArrayOf()

        arr.forEach { if (it % divisor == 0) answer += it }
        answer.sort()

        if (answer.size == 0) answer += -1

        return answer
    }
}

forEach를 사용해서 푼 경우~

class Solution {
    fun solution(arr: IntArray, divisor: Int): IntArray {
        var answer = ArrayList<Int>()
        var idx: Int = 0

        for (i in arr) {
            if (i % divisor == 0) {
                answer.add(i)
            }
        }
        if (answer.isEmpty()) answer.add(-1)

        return answer.toIntArray().sortedArray()
    }
}

처음에 answer을 빈 IntArray로 설정하고

index를 표현할 변수 idx 를 만들었음

그리고 for 문으로 divisor로 나누어지면 i를 answer에 추가

만약에 answer이 빈배열이면 -1을 추가함

그리고 answer을 리턴하고 정수배열로 만들어주고, 정렬을해줌


Iterable 확장 함수에 대해서 공부하면 더 쉽게 풀 수 있었을듯!
빨리 공부해야지~~

profile
오리너구리입니다

0개의 댓글