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

불꽃망토·2020년 10월 8일
1

Programmers

목록 보기
1/1

-- 문제링크 --
두 개 뽑아서 더하기

[문제설명]

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.

[제한사항]

numbers의 길이는 2 이상 100 이하입니다.
numbers의 모든 수는 0 이상 100 이하입니다.

[입출력 예]

----- ArrayList 이용 -----

import java.util.ArrayList;
import java.util.Arrays;

class Solution {
    public int[] solution(int[] numbers) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        
        for(int i=0; i<numbers.length; i++){
            for(int j=i+1;j<numbers.length; j++){
                int a = numbers[i]+numbers[j];
                if (list.indexOf(a) < 0){
                	list.add(a);
                }
            }
        }
        
        int[] answer = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }
        Arrays.sort(answer);

        return answer;
    }
}

----- HashSet 이용 -----

import java.util.HashSet;
import java.util.Set;

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]);
            }
        }

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

▶ HashSet의 특징

  • 중복된 값을 허용 X
  • 순서를 보장 X
  • null 값을 저장할 수 O
  • 내부적으로 HashMap을 사용하여 데이터를 저장

▶ HashSet 생성

HashSet<Type> name = new HashSet<>();

▶ HashSet이 지원하는 메소드

  • add()
    - 인자를 저장
    - 객체를 저장할 때 객체가 Set에
    저장되어있지 않았다면 True를 리턴
    저장되어있다면 False를 리턴
    public boolean add(E e)
  • remove()
    - 인자로 전달된 객체를 Set에서 삭제
    - 객체를 삭제할 때 객체가 Set에
    존재하여 삭제 되었으면 True를 리턴
    존재하지 않았다면 False를 리턴
    public boolean remove(Object o)
  • removeAll()
    - 인자로 받은 Collection에 저장된 아이템들을 HashSet에서 삭제
    boolean removeAll(Collection<?> c) 
Set<String> abc = new HashSet<String>();
abc.add("aaa");
abc.add("bbb");
abc.add("ccc");
System.out.println("abc : " + abc);

List<String> removed = new ArrayList<>();
removed.add("aaa");
removed.add("ccc");

abc.removeAll(removed);
System.out.println("abc : " + abc);

  //abc : [aaa, ccc, bbb]
  //abc : [bbb]
  • removeIf()
    - 인자로 람다식을 받을 수 있다
    - 함수형 인터페이스로 만들어진 객체를 받는다고 할 수 있다
    - Set의 아이템 중에 이 조건에 충족하는 객체는 삭제
public boolean removeIf(Predicate<? super E> filter)
//스트링의 길이가 4보다 큰 아이템을 삭제
  • size()
    - HashSet에 저장된 아이템 개수를 리턴
public int size()
  • clear()
    - HashSet의 모든 아이템들을 삭제
public void clear()
  • contains()
    - Set 안에 객체가 존재하는지 여부를 리턴
public boolean contains(Object o)
  • iterator()
    - Iterator 객체를 리턴
    - 이 객체로 Set의 모든 아이템을 순회할 수 있다
public Iterator<E> iterator()
Set<String> abc = new HashSet<String>();
abc.add("aaa");
abc.add("bbb");
abc.add("ccc");

//----- 첫번째 방법  -----
Iterator<String> it = abc.iterator();
while (it.hasNext())
    System.out.println("abc : " + it.next());

//----- 두번째 방법 -----
for (String printabc : abc) {
	System.out.println("abc : " + printabc);
}

// abc : aaa
// abc : bbb
// abc : ccc
  • isEmpty()
    - Set에 저장된 아이템이 없으면 True를 리턴
public boolean isEmpty()
profile
우주 최고의 개발자가 되고 싶은 주니어개발자

3개의 댓글

comment-user-thumbnail
2020년 10월 16일

잘 보구가요 정리가 잘 되어있네요

답글 달기
comment-user-thumbnail
2021년 4월 14일

안녕하세요 올려주신 코드 잘 봤습니다. 궁금한 점이 있어서 댓글 남깁니다.

if (list.indexOf(a) < 0){
list.add(a);
}

이 부분인데 중복되는 숫자 없게 할려고 하시는건가요..?
만약에 a가 7인데 list 값에 없으면 -1값으로 나와서
list에 7이 들어가는건가요?!

1개의 답글