두 개 뽑아서 더하기
좋아요, 이 문제도 자주 등장하는 조합 + 정렬 + 중복 제거 유형이라 옵시디언에 정리해두면 추후 "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);
}
📌 복기 포인트
- Set 중복 제거의 편리함
HashSet으로 간단하게 중복을 제거하고,
이후List로 정렬 가능
- 이중 for문 조건:
j = i + 1
→ 자기 자신을 더하지 않음
→ 중복된 쌍 (ex: (1,2) vs (2,1)) 방지 - 최종 반환은 배열
→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;
}
}
중복된 숫자 개수
'[코딩테스트]' 카테고리의 다른 글
| 과일 장수 - 프로그래머스 - java (0) | 2025.05.05 |
|---|---|
| K번째수 - 프로그래머스 (java) (0) | 2025.05.05 |
| [프로그래머스] 이중우선순위 (0) | 2024.06.07 |
| [프로그래머스] 정수 삼각형 - Java (0) | 2024.06.06 |
| [프로그래머스] 약수의 합 - java (0) | 2024.04.06 |