728x90
조건
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
알고리즘 예상
- 반복문을 통해 가능한 모든 합을 만든다.
- 중복을 제거한다.
- 정렬한 후 반환한다.
초기 코드
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()
}
}
개선점 또는 배운점
- 해석이 참 어렵다. list변수는 numbers를 list 타입으로 바꾼것이고 withIndex()를 통해 인덱스에 접근할 수 있게 했다. 그 후 flatMap 메소드를 통해 인덱스가 포함된 list의 원소를 pair로 갖는 원소를 가진 컬렉션을 만들었고 filter를 이용해 pair의 index가 서로 같지 않은 원소만 남기고 map을 이용해 pair의 두 값을 더한 콜렉션을 만든 후 toSortedSet을 이용해 정렬된 set을 만들고 IntArray로 변환했다.
- set에는 중복요소가 들어갈 수 없으므로 set을 활용하면 중복 없는 배열을 얻을 수 있다.
- 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
'TIL > 알고리즘' 카테고리의 다른 글
| 02/19 알고리즘 공부(51) - 푸드 파이트 대회 (0) | 2024.02.19 |
|---|---|
| 02/16 알고리즘 공부(50) - 가장 가까운 글자 (0) | 2024.02.16 |
| 02/15 알고리즘 공부(48) - K번째 (0) | 2024.02.15 |
| 02/15 알고리즘 공부(47) - 문자열 내 마음대로 정렬하기 (0) | 2024.02.15 |
| 02/14 알고리즘 공부(46) - 숫자 문자열과 영단어 (0) | 2024.02.14 |