코딩테스트
프로그래머스 - 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);
}
- 결과를 순서대로 넣어줍니다.