TIL/알고리즘

02/15 알고리즘 공부(49) - 두 개 뽑아서 더하기

sos000303 2024. 2. 15. 16:26
728x90

조건

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.

 

알고리즘 예상

  1. 반복문을 통해 가능한 모든 합을 만든다.
  2. 중복을 제거한다.
  3. 정렬한 후 반환한다.

 

초기 코드

class Solution {
    fun solution(numbers: IntArray): IntArray {
        var answer: IntArray = intArrayOf()
        return answer
    }
}

 

내 코드

class Solution {
    fun solution(numbers: IntArray): IntArray {
        var answer: IntArray = intArrayOf()
        for(i in numbers.indices){
            for(j in i+1..numbers.size-1){
                answer += numbers[i]+numbers[j]
            }
        }
        return answer.distinct().sorted().toIntArray()
    }
}

삼총사때와 같이 for문의 중첩으로 풀었다. map을 이용하는 방법도 있을 것 같다.

다른 사람의 풀이

class Solution {
    fun solution(numbers: IntArray): IntArray {
        val list = numbers.toList()
        return list.withIndex().flatMap { i -> list.withIndex().map { j -> i to j } }
            .filter { it.first.index != it.second.index }
            .map { it.first.value + it.second.value }
            .toSortedSet()
            .toIntArray()
    }
}

 

개선점 또는 배운점

  1. 해석이 참 어렵다. list변수는 numbers를 list 타입으로 바꾼것이고 withIndex()를 통해 인덱스에 접근할 수 있게 했다. 그 후 flatMap 메소드를 통해 인덱스가 포함된 list의 원소를 pair로 갖는 원소를 가진 컬렉션을 만들었고 filter를 이용해 pair의 index가 서로 같지 않은 원소만 남기고 map을 이용해 pair의 두 값을 더한 콜렉션을 만든 후 toSortedSet을 이용해 정렬된 set을 만들고 IntArray로 변환했다.
  2. set에는 중복요소가 들어갈 수 없으므로 set을 활용하면 중복 없는 배열을 얻을 수 있다.
  3. pair를 이용해 합을 구하는 방법이 신선했다.

 

개선된 코드

class Solution {
    fun solution(numbers: IntArray): IntArray {
        var answer: IntArray = intArrayOf()
        for(i in numbers.indices){
            for(j in i+1..numbers.size-1){
                answer += numbers[i]+numbers[j]
            }
        }
        return answer.toSortedSet().toIntArray()
    }
}
728x90