문제
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
- 출력 예시 -
정답 코드
< 내 정답 코드 >
class Solution {
public int[] solution(int[] numbers) {
Set<Integer> treeSet = new TreeSet<>();
for (int i = 0; i < numbers.length - 1; i++) {
for (int j = i; j < numbers.length - 1; j++) {
treeSet.add(numbers[i] + numbers[j + 1]);
}
}
int[] result = new int[treeSet.size()];
Iterator<Integer> it = treeSet.iterator();
int idx = 0;
while (it.hasNext()) {
result[idx++] = it.next();
}
return result;
}
}
< 타인 답변 코드 >
class Solution {
public int[] solution(int[] numbers) {
int[] answer;
List<Integer> list = new ArrayList<Integer>();
for(int i = 0 ; i < numbers.length; i++){
for(int j = i+1 ; j < numbers.length; j++){
int tmp = numbers[i] + numbers[j];
if(!list.contains(tmp)){
list.add(tmp);
}
}
}
int size = 0;
answer = new int[list.size()];
for(int num : list){
answer[size++] = num;
}
Arrays.sort(answer);
return answer;
}
}
이것을 주의하자!
- 일단 모든 수를 한 번씩 곱해야 한다. 한 번씩만 곱하면 되기 때문에 중첩 for 문을 사용했다. 그리고 더한 값이 중복하지 않도록 Set 인터페이스를 사용했으며, 오름차순으로 정렬되기 때문에 정렬 기능이 있는 TreeSet 클래스를 이용했다.
- 특별히 어렵지 않았지만, Integer 을 저장하는 Set 컬렉션에서 원시형 배열로 값을 저장하는 방법에 대해 주의가 필요하다. 원래 컬렉션 프레임워크에서 제공하는 toArray( ) 메서드는 참조형 객체의 변환만 지원하기 때문에 원시형 배열로 변환하려면 for 문을 써야 한다. 하지만 Set 인터페이스는 인덱스를 사용하지 않아서 get( ) 메서드를 사용할 수 없다. 따라서 Iterator 객체로 만든 다음에 각각 반환시켜 배열에 넣었다.
- 타인 답변 코드에서는 List 인터페이스를 사용했다. Set 인터페이스를 사용하는 것이 더 좋다고 판단되나, List 인터페이스를 사용해도 if 문과 contains( ) 메서드를 통해 중복 여부를 확인하는 로직이 흥미로워서 가져왔다.
- 내 코드와 타인 답변 코드에서 중첩 for 문을 보면 내 것보다 타인 답변 코드의 중첩 for 문에 더 직관적으로 보인다.
'코딩 테스트' 카테고리의 다른 글
[프로그래머스] (Lv.1) 3진법 뒤집기 * (0) | 2022.09.04 |
---|---|
[프로그래머스] (Lv.1) 예산 (0) | 2022.09.04 |
[프로그래머스] (Lv.1) 2016년 (0) | 2022.09.04 |
[프로그래머스] (Lv.1) 나머지가 1이 되는 수 찾기 (0) | 2022.09.04 |
[프로그래머스] (Lv.1) 부족한 금액 계산하기 * (0) | 2022.09.04 |