PS/Programmers

[level1, HashSet/TreeSet] 두 개 뽑아서 더하기

git-sun 2023. 3. 30. 23:56

1. 문제

 

 

 

 

 

 

 

 

2. 문제 해결 논리

1. 문제 이해

  • 주어진 것
    • int[] numbers    // 임의의 자연수 배열
  • 요구되는 것
    • int[] answer    // 두 수의 합으로 나올 수 있는 모든 경우를 담은 배열(중복 X)

2. 데이터 구조 결정

  • 방법1. 중복 없이, 정렬없이 데이터를 저장하는 HashSet 이용
  • 방법2. 중복 없이, 오름차순 정렬을 유지하며 데이터를 저장하는 TreeSet 이용

3. 알고리즘 설계

3-1. HashSet 이용 시

  • 반복문을 통해 HashSet에 두 수의 합으로 나오는 모든 경우를 저장
  • 반복문을 통해 int[] 배열로 변환
  • Arrays.sort를 이용한 배열 정렬

3-2. TreeSet 이용시

  • 반복문을 통해 TreeSet에 두 수의 합으로 나오는 모든 경우를 저장
  • Iterator를 통해  int[] 배열로 변환

 

 

 

 

 

3. 코드 구현

3-1. HashSet 이용

import java.util.Arrays;
import java.util.HashSet;
class Solution {
    public int[] solution(int[] numbers) {
        HashSet<Integer> sumSet = new HashSet<>();
        
        //반복문을 통해 각 원소들의 합을 HashSet에 저장
        //중복 없음, 정렬 없음
        for (int i = 0; i < numbers.length - 1; i++) {
            for (int j = i + 1; j < numbers.length; j++) {
                sumSet.add(numbers[i] + numbers[j]);
            }
        }
        
        //HashSet의 크기만큼의 int 배열 생성 
        int[] answer = new int[sumSet.size()];
        
        //HashSet을 순회하며 int 배열에 저장
        int idx = 0;
        for (Integer value : sumSet) {
            answer[idx++] = value;
        }
        
        //int 배열 정렬
        Arrays.sort(answer);
        return answer;
    }
}

 

 

 

 

 

 

3-2. TreeSet 이용

import java.util.TreeSet;
import java.util.Iterator;
class Solution {
    public int[] solution(int[] numbers) {
        TreeSet<Integer> sumSet = new TreeSet<>();
        
        //반복문을 통해 각 원소들의 합을 TreeSet에 저장
        //중복 없음, 오름차순 정렬 유지
        for (int i = 0; i < numbers.length - 1; i++) {
            for (int j = i + 1; j < numbers.length; j++) {
                sumSet.add(numbers[i] + numbers[j]);
            }
        }
        
        //HashSet 사이즈만큼 int 배열 생성
        int[] answer = new int[sumSet.size()];
        
        
        //Interator를 통해 HashSet 순회하며 int 배열에 저장
        int idx = 0;
        Iterator<Integer> iterator = sumSet.iterator();
        while (iterator.hasNext()) {
            answer[idx++] = iterator.next();
        }
        
        //정렬할 필요없이 바로 반환
        return answer;
    }
}

 

 

 

 

 

 

 

* Reference

https://school.programmers.co.kr/learn/courses/30/lessons/68644

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형