[코딩테스트]

두 개 뽑아서 더하기 (프로그래머스 Lv1) - java

everydeveloper 2025. 5. 5. 18:22

두 개 뽑아서 더하기

좋아요, 이 문제도 자주 등장하는 조합 + 정렬 + 중복 제거 유형이라 옵시디언에 정리해두면 추후 "N개 중 2개 조합 문제"에서 매우 유용하게 재활용됩니다.


🟩 두 개 뽑아서 더하기 (프로그래머스 Lv1)


🧩 문제 요약

  • 주어진 정수 배열에서 서로 다른 인덱스 2개를 골라 더한 값들
    중복 없이 오름차순 정렬하여 리턴

🧠 핵심 개념

단계 설명
1. 모든 2개의 조합 생성 이중 for문 사용 (i, j=i+1)
2. 중복 제거 Set<Integer> 사용
3. 정렬 후 배열로 반환 List → 정렬 → 배열로 변환

🔄 조합은 순서가 중요하지 않으므로 i < j 만 고려
☑ 합한 결과는 중복 가능성이 있으므로 Set 사용


✅ 예시 코드 스니펫 (Java)

Set<Integer> set = new HashSet<>();
for (int i = 0; i < numbers.length; i++) {
    for (int j = i + 1; j < numbers.length; j++) {
        set.add(numbers[i] + numbers[j]);
    }
}

List<Integer> list = new ArrayList<>(set);
Collections.sort(list);

int[] answer = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
    answer[i] = list.get(i);
}

📌 복기 포인트

  1. Set 중복 제거의 편리함
    • HashSet으로 간단하게 중복을 제거하고,
      이후 List로 정렬 가능
  2. 이중 for문 조건: j = i + 1
    → 자기 자신을 더하지 않음
    → 중복된 쌍 (ex: (1,2) vs (2,1)) 방지
  3. 최종 반환은 배열
    int[] 변환을 잊지 않도록

⏱️ 시간 복잡도

  • 이중 반복문: O(n²)
  • 정렬: O(n log n)
  • 전체: O(n²)

입력 배열 길이가 작기 때문에 성능 부담 없음


🔄 확장 가능성

  • "두 수의 합", "세 수의 합" → 투 포인터로 확장 가능
  • 조합을 직접 구현하지 않고, for문으로도 충분히 가능함

🧠 옵시디언 정리 포맷 예시

## 🍒 두 개 뽑아서 더하기 (Lv1)

---

### 📌 문제 요약
배열에서 두 개의 서로 다른 수를 골라 더한 값 중,  
중복 없이 오름차순으로 정리해서 리턴

---

### 🚩 풀이 전략
- 중복 방지를 위해 Set 사용
- 모든 조합은 i < j 조건으로 이중 반복문
- 결과는 List로 변환 후 정렬 → 배열로 변환

---

### 🔧 핵심 코드
```java
Set<Integer> set = new HashSet<>();
for (int i = 0; i < numbers.length; i++) {
    for (int j = i + 1; j < numbers.length; j++) {
        set.add(numbers[i] + numbers[j]);
    }
}
```

---

### 💡 복기 포인트
- HashSet을 통해 자동 중복 제거 가능
- List → 정렬 → 배열 변환 패턴 익숙해지기
- 이 문제는 "조합 + 중복 제거 + 정렬"의 전형적인 케이스

이렇게 쌓이면 너의 옵시디언은 그냥 ‘개인 백준 해설서’가 되는 거야.
또 다른 문제도 정리하고 싶으면 알려줘!
필요하면 내가 마크다운 템플릿 자동 생성해줄 수도 있어.

import java.util.*;

class Solution {
    public int[] solution(int[] numbers) {
        Set<Integer> set = new HashSet<>();

        for (int i = 0; i < numbers.length; i++) {
            for (int j = i + 1; j < numbers.length; j++) {
                set.add(numbers[i] + numbers[j]);
            }
        }

        List<Integer> list = new ArrayList<>(set);
        Collections.sort(list);

        int[] answer = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }

        return answer;
    }
}

중복된 숫자 개수