[ 목차 ]
📢 문제 출처
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
📢 문제 설명
- array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
📢 입출력 예시
arr | divisor | return |
[5, 9, 7, 10] | 5 | [5, 10] |
[2, 36, 1, 3] | 1 | [1, 2, 3, 36] |
[3,2,6] | 10 | [-1] |
- 입출력 예 #1
- (1) arr의 원소 중 5로 나누어 떨어지는 원소는 5와 10입니다. 따라서 [5, 10]을 리턴합니다.
- 입출력 예 #2
- (1) arr의 모든 원소는 1으로 나누어 떨어집니다. 원소를 오름차순으로 정렬해 [1, 2, 3, 36]을 리턴합니다.
- 입출력 예 #3
- (1) 3, 2, 6은 10으로 나누어 떨어지지 않습니다. 나누어 떨어지는 원소가 없으므로 [-1]을 리턴합니다.
📢 풀이
📌 1번 풀이 (feat. ArrayList)
import java.util.*;
class Solution {
public int[] solution(int[] arr, int divisor) {
ArrayList<Integer> iArr = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
if(arr[i] % divisor == 0)
{
iArr.add(arr[i]);
}
}
int[] answer = {};
if(iArr.size() != 0) {
iArr.sort(Comparator.naturalOrder()); //오름차순 정렬
answer = new int[iArr.size()];
for (int i = 0; i < answer.length; i++) {
answer[i] += iArr.get(i);
}
}
else
{
answer = new int[1];
answer[0] = -1;
}
// System.out.println("answer = " + Arrays.toString(answer));
return answer;
}
}
- ArrayList를 선언 후에 int 배열 수만큼 반복문을 돌려서 divisor 나눴을 때 0이면 ArrayList에 값을 삽입
- 삽입 후에 만약 값이 있으면 배열을 오름차순 정렬 하고, answer에 값을 넣어준다.
- 삽입 후에 만약 값이 0이면 answer에 -1을 넣어서 리턴
📌 2번 풀이 (feat. Stream)
import java.util.Arrays;
class Solution {
public int[] solution(int[] arr, int divisor) {
int[] answer = Arrays.stream(arr).filter(factor -> factor % divisor == 0).toArray();
if(answer.length == 0) answer = new int[] {-1};
java.util.Arrays.sort(answer);
return answer;
}
}
- Arrays.stream.filter를 이용해서 answer라는 배열 선언
- 배열 선언 후에 값이 없으면 -1 리턴
- 아닐 시에는 배열을 sorting 하여 진행
📌 3번 풀이 (feat. 기본 배열)
import java.util.*;
class Solution {
public int[] solution(int[] arr, int divisor) {
int[] answer = {};
int count1 = 0; //나누어떨어지는 카운트
for (int i = 0; i < arr.length; i++) {
if(arr[i] % divisor == 0){
count1++;
}
}
//나누어 떨어지는 값이 없으면
if(count1 == 0)
{
answer = new int[1];
answer[0] = -1;
return answer;
}
int count2 = 0; //결과를 출력해야하는 배열의 인덱스
answer = new int[count1];
for (int i = 0; i < arr.length; i++) {
if(arr[i] % divisor == 0){
answer[count2] = arr[i];
count2++;
}
}
//오름차순 정렬
int tmp = 0;
for (int i = 0; i < answer.length; i++) {
for (int j = 0; j < answer.length - 1; j++) {
if(answer[j] > answer[j + 1])
{
tmp = answer[j];
answer[j] = answer[j + 1];
answer[j + 1] = tmp;
}
}
}
return answer;
}
}
- 처음엔 arr의 배열 인덱스 값을 받아서 divisor에 나눴을 때 나누어 떨어지는 지 체크한다.
- 만약 나누어떨어지는 게 없으면 -1로 리턴한다.
- 나누어떨어진 카운트 만큼 배열을 하나 생성하여 인덱스가 나누어떨어질 때의 Value를 배열에 삽입한다.
- 그 후 오름차순을 진행한다.
- tmp를 하나 생성해서, (현재 인덱스)보다 (인덱스 위치 +1)가 크면 해당 인덱스에 큰 값을 넣어준다.
📢 후기
- ArrayList로 하는 경우와 배열을 이용한 경우 2가지로 해당 경우를 만족하게 만들어봤는데, 솔직하게 ArrayList는 sort를 이용해서 간편하게 만든 경우이고, 배열의 경우는 하나하나 값을 넣었는데, 배열로 구현하는 게 엄청 어려운 거 같다.
반응형
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 없는 숫자 더하기 (0) | 2023.08.10 |
---|---|
[프로그래머스] n번째 원소까지 (0) | 2023.08.09 |
[프로그래머스] n번째 원소부터 (0) | 2023.08.09 |
댓글