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

2024. 4. 27. 19:02TIL

신나는 주말!

주말에는 간단한 알고리즘 문제를 풀어보자!

 

🔥알고리즘 문제

 

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

제한사항

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

입출력 예

arr divisor return
[5, 9, 7, 10] 5 [5, 10]
[2, 36, 1, 3] 1 [1, 2, 3, 36]
[3,2,6] 10 [-1]

입출력 예 설명

입출력 예#1
arr의 원소 중 5로 나누어 떨어지는 원소는 5와 10입니다. 따라서 [5, 10]을 리턴합니다.

입출력 예#2
arr의 모든 원소는 1으로 나누어 떨어집니다. 원소를 오름차순으로 정렬해 [1, 2, 3, 36]을 리턴합니다.

입출력 예#3
3, 2, 6은 10으로 나누어 떨어지지 않습니다. 나누어 떨어지는 원소가 없으므로 [-1]을 리턴합니다.

 

내가 작성한 코드 

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

내가 작성한 코드 해석

1.반환값인 answer를 int형 array배열로 선언! 

2.매개변수로 입력받은 arr안에 있는 값을 divisor로 나누어 떨어지는 조건을 만족하는 요소들을 걸러내기 위해서 고차함수인 filter()함수 사용

3. .toIntArray()를 통해서 answer의 데이터형태인 IntArray와 일치시켜주고 .sortedArray()를 통해서 오름차순 정렬

4.
만약 divisor로 나누어 떨어지는 값이 없는 경우는 answer의 size가 0인 경우이기 때문에 if문 작성 

5.answer값 반환

 

 

다른사람은 어떻게 했을까?

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
    }
}
// 사* , 이*훈 , 박*우 , 정*희 님이 작성하신 코드 입니다 
// 출처: https://school.programmers.co.kr/learn/courses/30/lessons/12910/solution_groups?language=kotlin

 

다른 사람이 작성한 코드 해석

1. 반환값인 answer를 int형 array배열로 선언! 

2.forEach 고차함수를 이용해서 각 요소가 divisor에 나누어 떨어지는 경우에 answer+= it 을 통해 answer의 array배열에 그 요소들을 추가 

3. answer.sort()를 통해 오름차순 정렬

4. if문으로 size가 0인경우 -1값 적용

5. answer값 반환

 

 

더 개선해야할 Point

filter 함수를 이용해서 그 조건에 맞는 요소들만 따로 뽑을 생각만 했었는데  다른 사람의 풀이에서  answer+=it  을 보았을때 엄청난 충격이 파도처럼 밀려왔다....answer+=it 의 형태는 int형이나 double형처럼 문자형 데이터타입에서만 사용이 가능한 줄 알았는데  Kotlin에서는 += 연산자를 사용하여 배열에 요소를 추가할 수 있다고 한다. 이는 배열에 새로운 요소를 추가하는 것이 아니라, 새로운 배열을 생성하고 기존 배열의 요소와 추가된 요소를 포함한 새로운 배열을 할당하는 것이라고 한다. .filter뿐만 아니라 .map이나  .forEach같은 고차함수에 더 익숙해져야겠다

 

알고리즘 GitHub: https://github.com/kotlin2024/algorithm/commit/d8caaa84e99b33b1d9af76ca2f342643b88bb88b 

 

 

'TIL' 카테고리의 다른 글

Enum class  (0) 2024.04.29
(알고리즘) 핸드폰 번호 가리기  (0) 2024.04.28
여러작업을 한번에 수행하자  (0) 2024.04.26
Test Code 작성을 생활화 합시다  (0) 2024.04.25
Class에 관하여  (0) 2024.04.24