[프로그래머스/Kotlin] 두 개 뽑아서 더하기
문제 링크 -> 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 })
------------------------------------------------------------결과------------------------------------------------------------------
재귀함수로 완전탐색을 할 수 있다면 간단한 문제였습니다!
- 문제에 대한 질문 댓글 환영!
- 중간에 잘못된 부분이 있다면 댓글로 남겨주세요. 수정하겠습니다.