[Kotlin] 나누어 떨어지는 숫자 배열 (프로그래머스 알고리즘)
반응형

 

문제

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

 

 


 

접근

 

  • 1. arr의 원소 개수만큼의 반복문 작성
  • 2. arr의 원소 중 divisor로 나누어 나머지가 0인 값을 배열 returnArray에 저장
  • 3. 만약 1의 과정에서 returnArray에 아무 값이 없다면 배열에 -1을 담아 리턴
  • 4. 값이 하나라도 있다면 오름차순으로 배열한 returnArray를 리턴. 이 정도로 구상했다.
//구상, 오류 코드

class Solution {
    fun solution(arr: IntArray, divisor: Int): IntArray {
        
        lateinit var returnArray : IntArray
        
        for(i in arr){
            if (arr[i] % divisor == 0 ) returnArray.plus(arr[i]) 
        }
        when(returnArray.size){
            0 -> return returnArray.plus(-1)
            else -> return returnArray.sortedArray()
        }
    }
}
  • returnArray라는 것을 만들어주고 안에서 원소를 더하려고 했는데, 초기화가 문제였다.
  • lateinit으로 초기화가 될 줄 알았는데 오류가 난다. 문제점은 아래와 같다.
  • (1) returnArray가 초기화되지 않았다.
    - returnArray는 lateinit var로 선언되었지만 초기화되지 않았다.
    - returnArray를 초기화할 때 IntArray의 생성자를 호출해야 한다. (var returnArray = intArrayOf())
  • (2) plus 함수의 사용이 잘못되었다.
    - returnArray.plus(arr[i])는 returnArray에 arr[i]를 추가하는 것이 아니다.
    - plus 함수는 배열에 요소를 추가하는 것이 아니라 새로운 배열을 반환하는 함수이다.
    - 따라서 이 코드는 실제로 returnArray를 수정하지 않는다.
    - returnArray에 원소를 추가하고 싶으면 그냥 단순하게 += 를 사용하면 된다. 
  • (3) for문의 식이 잘못되었다.
    - for(i in arr)는 0부터 arr의 주소 갯수만큼 꺼내주는 게 아니라! arr에 있는 원소를 처음부터 끝까지 꺼내주는 거다.
    - 따라서 i는 원소 각각의 값이 나오기 때문에, arr[i]가 아닌 i로 식을 적어야 한다.

 


 

성공 코드

 

class Solution {
    fun solution(arr: IntArray, divisor: Int): IntArray {
        
        var returnArray = intArrayOf()
        
        for(i in arr){
            if (i % divisor == 0 ) returnArray += i
        }
        
        when(returnArray.size){
            0 -> return intArrayOf(-1)
            else -> return returnArray.sortedArray()
        }
    }
}

 


 

설명

 

  1. arr의 원소 각각을 비교할 반복문인 for문을 작성한다.
  2. arr의 원소 중 divisor로 나누어 나머지가 0인 값을 배열 returnArray에 저장한다.
  3. 위 과정을 모두 수행한 뒤 for문을 빠져나오고,
    returnArray에 아무 값이 없다면 배열에 -1을 담아 리턴,
    값이 있다면 배열 returnArray를 오름차순으로 정렬하고 리턴한다.

 


 

다른 방법

 

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

        val answer = arrayListOf<Int>()
        for (i in arr){
            if (i % divisor == 0) answer.add(i)
        }
        if (answer.size == 0){
            answer.add(-1)
        }
        return answer.sorted().toIntArray()
    }
}
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
    }
}

 

 

반응형
 💬 C O M M E N T