내코가석자

02-2. 두 개 뽑아서 더하기 (프로그래머스, JAVA)

gani00 2026. 3. 11. 16:42

📘 [Java] 두 개 뽑아서 더하기 (프로그래머스)

문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/68644

 

배열에서 서로 다른 두 인덱스의 값을 더한 결과를 구하고, 중복을 제거한 뒤 오름차순으로 정렬하여 반환하는 문제이다.


🧠 풀이 과정

1️⃣ 문제 분석

문제의 핵심 조건

  • 서로 다른 인덱스의 두 수를 선택
  • 두 수의 합을 모두 구하기
  • 중복 제거
  • 오름차순 정렬

예시

numbers = [2,1,3,4,1]

가능한 합

2+1
2+3
2+4
2+1
1+3
1+4
1+1
...

두 수의 조합 개수

n(n-1)/2

2️⃣ 접근 방식

✔ 이중 반복문

두 개의 인덱스를 선택하기 위해 이중 반복문을 사용한다.

for(int i = 0; i < numbers.length - 1; i++){
    for(int j = i + 1; j < numbers.length; j++){

이렇게 하면 i, j 조합이 생성되고

(i, j)
  • 같은 인덱스 사용 방지 가능
  • 중복 조합 방지 가능

 


✔ 중복 제거 방법

중복 제거 방법은 크게 2가지가 있다.

방법 1. List + contains()

  • 리스트에 값이 이미 존재하면 추가하지 않음
if(!list.contains(sum)){
    list.add(sum);
}

하지만 contains()는 내부적으로 O(n) 탐색이기 때문에 데이터가 많아질수록 성능이 떨어질 수 있다.


방법 2. HashSet 

HashSet은 중복을 자동으로 제거한다.

이미 존재하는 값이면 자동 무시.

set.add(value)

 

시간복잡도

O(1)

3️⃣ 알고리즘 설계

전체 흐름

1. 두 수의 합 구하기
2. 중복 제거
3. 정렬
4. 배열 반환

💻 풀이 1 — List 활용

import java.util.*;

class Solution {
    public int[] solution(int[] numbers) {

        // 결과 저장 리스트
        List<Integer> list = new ArrayList<>();

        // 두 수의 합 계산
        for(int i = 0; i < numbers.length - 1; i++){
            for(int j = i + 1; j < numbers.length; j++){

                int sum = numbers[i] + numbers[j];

                // 중복 체크
                if(!list.contains(sum)){
                    list.add(sum);
                }
            }
        }

        // List → 배열 변환
        int[] ans = new int[list.size()];
        for(int i = 0; i < list.size(); i++){
            ans[i] = list.get(i);
        }

        // 정렬
        Arrays.sort(ans);

        return ans;
    }
}

💻 풀이 2 — HashSet 활용

중복 제거를 위해 HashSet을 사용한다.

import java.util.*;

class Solution {
    public int[] solution(int[] numbers) {

        // 중복 제거를 위한 HashSet
        HashSet<Integer> set = new HashSet<>();

        // 두 수의 합 구하기
        for(int i = 0; i < numbers.length - 1; i++){
            for(int j = i + 1; j < numbers.length; j++){
                set.add(numbers[i] + numbers[j]);
            }
        }

        // Set → 정렬 → 배열 변환
        return set.stream()
                .sorted()
                .mapToInt(Integer::intValue)
                .toArray();
    }
}

 


⏱ 시간복잡도

이중 반복문

O(n²)

정렬

O(n log n)

전체 시간복잡도

O(n²)

(이중 반복문이 가장 큰 영향)


🚀 정리

1️⃣ 두 수의 조합 만들기 - 이중 반복

for(int i = 0; i < n; i++)
    for(int j = i+1; j < n; j++)

 

2️⃣ 중복 제거

1. List + contains
2. HashSet

 

3️⃣ 컬렉션 → 배열 변환

set.stream()
   .sorted()
   .mapToInt(Integer::intValue)
   .toArray();

 

'내코가석자' 카테고리의 다른 글

02-3. 모의고사 (프로그래머스, JAVA)  (0) 2026.03.11
02-1. 배열 몸풀기 문제  (0) 2026.03.11
02. 배열  (0) 2026.03.07
01. 필수 문법  (0) 2026.03.07
00. 코딩 테스트 준비  (0) 2026.03.07