📚 문제설명
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- numbers의 길이는 2 이상 100 이하입니다.
- numbers의 모든 수는 0 이상 100 이하입니다.
🔎 입출력 예
입출력 예 #1
- 2 = 1 + 1 입니다. (1이 numbers에 두 개 있습니다.)
- 3 = 2 + 1 입니다.
- 4 = 1 + 3 입니다.
- 5 = 1 + 4 = 2 + 3 입니다.
- 6 = 2 + 4 입니다.
- 7 = 3 + 4 입니다.
- 따라서 [2,3,4,5,6,7] 을 return 해야 합니다.
입출력 예 #2
- 2 = 0 + 2 입니다.
- 5 = 5 + 0 입니다.
- 7 = 0 + 7 = 5 + 2 입니다.
- 9 = 2 + 7 입니다.
- 12 = 5 + 7 입니다.
- 따라서 [2,5,7,9,12] 를 return 해야 합니다.
✍🏻 코드 설명
이 문제는 numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return하는 문제입니다.
저는 총 4단계 순으로 문제를 풀어 주었습니다.
1단계) 두 개의 수를 뽑아 더하기
int[] answer = new int[numbers.length*numbers.length-numbers.length];
numbers 배열에서 서로 다른 두 개의 수를 뽑아 만들 수 있는 모든 합을 저장하기 위해 answer 배열을 선언하였습니다.
주어진 문제에서는 "서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수"를 찾아야 합니다.
numbers 배열의 길이가 n이라고 할 때, 두 개의 수를 뽑아 만들 수 있는 모든 경우의 수는 n * n입니다.
그러나 문제에서는 서로 다른 인덱스의 수를 더하는 것이기 때문에, 자기 자신을 더하는 경우를 제외해야 합니다.
따라서 n * n - n 개의 합으로 선언해주었습니다.
for(int i = 0; i < numbers.length; i++){
for(int j = 0; j < numbers.length; j++){
if(i!= j)
answer[index++] = numbers[i] + numbers[j];
}
}
그 후 이중 for문을 사용하여 두 개의 수를 뽑을 수 있도록 만들어주었습니다.
if(i!= j)
두 개의 수를 뽑아 더해야 하므로 같은 수가 더해지지 않도록 if문을 이용하여 만약 i가 j가 아니라면
answer[index++] = numbers[i] + numbers[j];
이 코드를 실행되게 만들어 주었습니다.
2단계) 정렬하기
Arrays.sort(answer);
Arrays.sort()메소드를 이용하여 answer값을 정렬해주었습니다. 또한 이 메소드를 사용하기 위해
import java.util.*;
java.util.*을 임포트 해주었습니다.
3단계) 중복되는 수의 개수 구하기
중복되는 수를 구하기 위해서는 중복되는 수의 개수를 구해야합니다.
왜냐하면 중복 제거된 수를 담을 배열을 생성할 때 중복되는 수의 개수를 빼서 생성해야하기 때문입니다.
int cnt = 0;
먼저 중복되는 수를 구해줄 cnt를 선언하고 초기화 해줍니다.
for(int i = 1; i < answer.length; i++)
그 후 i를 1부터 시작하여 answer의 길이까지 반복하게 만들어줍니다.
if(answer[i-1] == answer[i])
cnt++;
answer[i-1]은 현재 원소의 바로 이전 원소를 의미하고, answer[i]은 현재 원소를 의미합니다.
이 두 개의 값을 비교하여 값이 같다면 중복된 합이므로 cnt 변수를 증가시킵니다.
4단계) 중복제거하기
이제 중복제거를 해줄 것입니다.
먼저 중복제거된 수들을 저장할 새로운 result배열을 생성합니다.
int result[] = new int[answer.length-cnt];
reuslt의 길이는 answer의 길이에서 중복된 수의 개수를 뺀 길이로 생성해 줍니다.
int rIndex = 0;
result의 인덱스 값으로 사용할 변수를 선언하고 초기화 해줍니다.
result[0] = answer[0];
이 코드는 중복이 제거된 합 중에서 가장 작은 값인 answer[0]을 result 배열의 첫 번째 위치에 저장하기 위해 사용됩니다.
주어진 코드에서 answer 배열은 정렬된 상태이므로 중복이 제거된 합들이 오름차순으로 정렬되어 있습니다.
따라서 중복이 제거된 합 중 가장 작은 값은 answer 배열의 첫 번째 원소인 answer[0]입니다.
그러므로 result[0]에 answer[0] 값을 저장함으로써, 중복이 제거된 결과를 저장하는 result 배열의 첫 번째 위치에 가장 작은 값이 위치하도록 설정해주었습니다.
for(int i = 1; i< answer.length; i++){
if(result[rIndex] == answer[i])
continue;
result[++rIndex] = answer[i];
}
for문을 이용해 answer 배열을 순회하면서 현재 원소가 result 배열에 이미 존재하는지 확인합니다.
만약 이미 존재한다면 중복된 값이므로 continue를 이용해 다음 구문을 실행 하도록 만들어주었습니다.
result[++rIndex] = answer[i];
위의 코드는 중복이 제거된 answer[i] 값을 result 배열의 다음 위치에 저장하는 역할을 합니다.
++rIndex를 사용하여 rIndex 값을 먼저 1 증가시키고, 그 값을 배열 인덱스로 사용하여 result 배열에 값을 저장합니다.
이를 반복하여 중복이 제거된 모든 값을 result 배열에 저장합니다.
💡 소스코드&결과
코드
import java.util.*;
class Solution {
public int[] solution(int[] numbers) {
int[] answer = new int[numbers.length*numbers.length-numbers.length];
int index = 0;
// 두 개의 수를 뽑아 더하기
for(int i = 0; i < numbers.length; i++){
for(int j = 0; j < numbers.length; j++){
if(i!= j)
answer[index++] = numbers[i] + numbers[j];
}
}
// 정렬
Arrays.sort(answer);
// 중복되는 수 구하기
int cnt = 0;
for(int i = 1; i < answer.length; i++){
if(answer[i-1] == answer[i])
cnt++;
}
// 중복 제거
int result[] = new int[answer.length-cnt];
int rIndex = 0;
result[0] = answer[0];
for(int i = 1; i< answer.length; i++){
if(result[rIndex] == answer[i])
continue;
result[++rIndex] = answer[i];
}
return result;
}
}
결과
'Coding Test > 프로그래머스' 카테고리의 다른 글
[JAVA] 가장 가까운 같은 글자 (2) | 2023.06.08 |
---|---|
[JavaScript] 홀짝에 따라 다른 값 반환하기 (9) | 2023.06.07 |
[JAVA] 콜라 문제 (4) | 2023.06.05 |
[JAVA] K번째수 (2) | 2023.06.02 |
[JAVA] 푸드 파이트 대회 (0) | 2023.06.02 |