더 나은 내일의 내가 되자!

프로그래머스 - Java - 1 - 두 개 뽑아서 더하기 본문

코딩테스트

프로그래머스 - Java - 1 - 두 개 뽑아서 더하기

프루니에 2021. 3. 15. 23:54

문제

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

제한사항

  • numbers의 길이는 2 이상 100 이하입니다.

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

입출력 예

정답

import java.util.ArrayList;

class Solution {
    public int[] solution(int[] numbers) {
        int[] answer = {};
        ArrayList<Integer> stack = new ArrayList<>();

        // 계산
        for(int i=0; i<numbers.length; i++){
            for(int j=i+1; j<numbers.length; j++){
                int sum = numbers[i]+numbers[j];
                if (!stack.contains(sum)) { // 중복제거
                    stack.add(sum);
                }
            }
        }

        // 정렬
        int cnt = -1;
        int temp = 0;
        while(cnt<stack.size()-2){
            cnt++;
            if(stack.get(cnt) > stack.get(cnt+1)){
                temp = stack.get(cnt);
                stack.set(cnt, stack.get(cnt+1));
                stack.set(cnt+1, temp);
                cnt=-1;
            }
        }

        // 결과 넣기
        answer = new int[stack.size()];
        for(int i=0; i<=stack.size()-1; i++){
            answer[i] = stack.get(i);
        }
        return answer;
    }
}

풀이

코드실행으로 테스트 케이스 2개 맞춘 다음 제출에서 통과가 안돼서 ArrayList로 구조를 바꾼 후에 왜 제출에서 다 틀리나 했는데 import가 따로 필요했습니다.

처음에는 int[] stack 으로 선언해서 풀었었는데요 테스트 케이스 두개가 너무 오래걸려서 로직을 줄이려고 ArrayList로 바꾸었습니다.

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

  • 문제가 numbers[0] + numbers[1], numbers[0] + numbers[2], numbers[0] + numbers[3] 이런식으로 서로 더하는 경우의 수이기 때문에 numbers.length만큼 반복하는 for문을 하나 만들고

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

  • 그 안에 식 x + y가 있다면 x에 한번 쓴 숫자는 쓰지 않기 위해 j=i+1을 해줬습니다.

!stack.contains(sum)

  • stack.contains(sum)는 stack 안에 sum이 있는지 확인하는 함수인데 앞에 !가 붙어서 없으면 stack에 추가합니다.

while(cnt<stack.size()-2){

  • .size()는 1 부터 숫자를 return하기 때문에 -1 해주는데 cnt = -1; 해줬기 때문에 -2를 해줬습니다.
cnt++;  
if(stack.get(cnt) > stack.get(cnt+1)){  
  temp = stack.get(cnt);  
  stack.set(cnt, stack.get(cnt+1));  
  stack.set(cnt+1, temp);  
  cnt=-1;  
}
  • 이 부분은 결과를 버블정렬 하는 부분입니다.

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

  • 결과의 크기만큼 선언해줍니다.
for(int i=0; i<=stack.size()-1; i++){  
    answer\[i\] = stack.get(i);  
}
  • 결과를 순서대로 넣어줍니다.