코딩테스트연습/프로그래머스

[프로그래머스 - JAVA] 두 개 뽑아서 더하기

:)jun 2021. 12. 2. 19:01

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

 

코딩테스트 연습 - 두 개 뽑아서 더하기

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

programmers.co.kr

//테스트코드
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class Quiz1_plusTwoElementsTest {

    Quiz1_plusTwoElements q;

    @BeforeEach
    void setUp() {
        q = new Quiz1_plusTwoElements();
    }

    @Test
    void 길이2일때(){
        assertArrayEquals(new int[]{3},q.solution(new int[]{1,2}));
    }
    @Test
    void test2(){
        assertArrayEquals(new int[]{2,3,4,5,6,7},q.solution(new int[]{2,1,3,4,1}));
    }
    @Test
    void test3(){
        assertArrayEquals(new int[]{2,5,7,9,12},q.solution(new int[]{5,0,2,7}));
    }
}

// 길이가 2일때 위험하니까 한번 확인해주자

// 프로덕션코드
import java.util.*;

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

        Set<Integer> setOfSum = new HashSet<>();

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

        int[] answer = new int[setOfSum.size()];

        int i = 0;
        Iterator<Integer> iterator = setOfSum.iterator();

        while (iterator.hasNext()) {
            answer[i] = iterator.next();
            i++;
        }

        Arrays.sort(answer);

        return answer;
    }
}

//성공! 중복x 집합개념이니까 Set 사용했다. Set->Array로 자연스럽게 넘어갈 수 있는 방법이 없을까?
// Object[] toArray() 있는데 객체 배열로 반환한다. Integer객체로 바꿀 수 있을까?
// Integer[] arr = set.toArray(new Integer[0])
// Set 객체의 toArray() 메소드를 이용하면 된다.
// 이때 배열의 크기를 0으로 지정하면 자동으로 배열의 크기가 지정된다.

 

toArray를 Object[]타입으로 리턴하는 것이 아닌 String[] 으로 리턴하고 싶다면,

set.toArray(new String[0]) 으로 작성해주면 된다.

https://stackoverflow.com/questions/5061640/make-arraylist-toarray-return-more-specific-types

 

make arrayList.toArray() return more specific types

So, normally ArrayList.toArray() would return a type of Object[]....but supposed it's an Arraylist of object Custom, how do I make toArray() to return a type of Custom[] rather than Object[]?

stackoverflow.com

int[] 랑 Integer[] 가 다르구나??

뭐지...? int는 primitive type이고 Integer는 Integer객체인건가...?

Yes!

설명이 깔끔한 블로그 글을 첨부한다.

https://includestdio.tistory.com/1

 

[Java] Integer와 int의 차이

1. Primitive 자료형 - Wrapper 클래스 관계  int  primitive 자료형 (long, float, double ...)  산술 연산이 가능하다.  null로 초기화 할 수 없다.  Integer  Wrapper 클래스 (객체)  Unboxing을 하지..

includestdio.tistory.com

 

//프로덕션코드

import java.util.*;

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

        Set<Integer> setOfSum = new HashSet<>();

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

        Integer[] IntegerAnswer = setOfSum.toArray(new Integer[0]);
        int[] answer = new int[IntegerAnswer.length];

        for (int i = 0; i < IntegerAnswer.length; i++) {
            answer[i] = IntegerAnswer[i];
        }

        Arrays.sort(answer);

        return answer;
    }
}

// 성공! 하지만 더 코드가 깔끔해질 수 있을것 같은데... 자바의 정석 기초편 쭉 듣고 다시 와보자.
// 1달에 한번씩 이제까지 했던 것들을 쭉 리뷰해보면서 보완하는 시간을 가져야겠다.
// 열심히 했다면 부족한 부분이 많이 보일 것이고 그게 아니라면 반성해야지...
// 리팩토링하고 마무리하자.

//프로덕션코드
import java.util.*;

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

        Set<Integer> setOfSum = new HashSet<>();
        getSetOfSum(numbers, setOfSum);

        Integer[] IntegerAnswer = setOfSum.toArray(new Integer[0]);

        int[] answer = new int[IntegerAnswer.length];
        getIntTypeAnswer(IntegerAnswer, answer);

        Arrays.sort(answer);

        return answer;
    }

    private void getIntTypeAnswer(Integer[] IntegerAnswer, int[] answer) {
        for (int i = 0; i < IntegerAnswer.length; i++) {
            answer[i] = IntegerAnswer[i].intValue();  //.intValue() 없어도 자동으로 바꿔주긴 하네.
        }
    }

    private void getSetOfSum(int[] numbers, Set<Integer> setOfSum) {
        for (int i = 0; i < numbers.length - 1; i++) {
            for (int j = i + 1; j < numbers.length; j++) {
                setOfSum.add(numbers[i] + numbers[j]);
            }
        }
    }
}

// 성공!