Kotlin(프로그래머스)/Level 1

[프로그래머스/Kotlin] 두 개 뽑아서 더하기

Yuno. 2022. 3. 19. 00:30
728x90

문제 링크 -> https://programmers.co.kr/learn/courses/30/lessons/68644

 

코딩테스트 연습 - 두 개 뽑아서 더하기

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

programmers.co.kr

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

제한사항

  • numbers의 길이는 2 이상 100 이하입니다.
    • numbers의 모든 수는 0 이상 100 이하입니다.

------------------------------------------------------------풀이------------------------------------------------------------------
* numbers에서 2개를 뽑기 위해 재귀함수를 사용합니다. 
* 모든 경우의 수를 확인해야하므로 완전탐색합니다. 
* 재귀 함수에대한 설명은 같은 카테고리의 "소수 만들기"에 나와있습니다. 

class Solution {
    var answer = ArrayList<Int>()
    fun solution(numbers: IntArray): IntArray {
        check(numbers, Array<Boolean>(numbers.size){false}, 0, 0)
        return answer.distinct().sorted().toIntArray()
    }
    
    fun check(array : IntArray, visit : Array<Boolean>, start : Int, count : Int){
        var sum = 0
        if(count == 2){
            for(i in 0..visit.size-1){ // 5번째 줄
                if(visit[i]){
                    sum +=array[i]
                }
            }				//11번째 줄
            answer.add(sum)
        }
        else{
            for( i in start..array.size-1){
                visit[i] = true
                check(array, visit, i+1,  count+1)
                visit[i] = false
            }
        }
    }
}


코드 11~5번줄은 아래처럼 1줄로 작성할 수 있겠네요 

sum = array.foldIndexed(0){ index, total, value -> if( visit[index]) total + value else total }

 

12번 줄도 줄이고 싶다면 아래처럼 작성할 수 있습니다. 이렇게 하면 불필요한 sum 변수도 필요가 없어지니 메모리를 덜 사용하겠네요 

answer.add(array.foldIndexed(0){ index, total, value -> if( visit[index]) total + value else total })

------------------------------------------------------------결과------------------------------------------------------------------

재귀함수로 완전탐색을 할 수 있다면 간단한 문제였습니다!

 

 

 

 

 

- 문제에 대한 질문 댓글 환영!
- 중간에 잘못된 부분이 있다면 댓글로 남겨주세요. 수정하겠습니다.

 

728x90