[JAVA] 나누어 떨어지는 숫자 배열

태로미·2023년 9월 14일
0

Programmers

목록 보기
14/29
post-thumbnail

❓문제


array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.



🚫제한


  • arr은 자연수를 담은 배열입니다.
  • 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
  • divisor는 자연수입니다.
  • array는 길이 1 이상인 배열입니다.


💻입출력 예


arrdivisorreturn
[5, 9, 7, 10]5[5, 10]
[2, 36, 1, 3]1[1, 2, 3, 36]
[3,2,6]10[-1]

입출력 예#1
arr의 원소 중 5로 나누어 떨어지는 원소는 5와 10입니다.
따라서 [5, 10]을 리턴합니다.
입출력 예#2
arr의 모든 원소는 1으로 나누어 떨어집니다.
원소를 오름차순으로 정렬해 [1, 2, 3, 36]을 리턴합니다.
입출력 예#3
3, 2, 6은 10으로 나누어 떨어지지 않습니다.
나누어 떨어지는 원소가 없으므로 [-1]을 리턴합니다.














📝해결


1. 배열 & 리스트

class Solution {
	public int[] solution(int[] arr, int divisor) {
        
		ArrayList<Integer> arrList = new ArrayList<Integer>();
		Arrays.sort(arr);
		
		// 나누어 떨어지는 값 구하기
		for(int i=0; i<arr.length; i++) {
			if(arr[i] % divisor == 0) {
				arrList.add(arr[i]);
			}
		}
		
	    // 값이 없을 경우
		if(arrList.size() == 0) {
			arr = new int[1];
			arr[0] = -1;
     	 // arr = {-1};
		}
       // 있을 경우 List -> int[]
		else {
			arr = new int[arrList.size()];
			for(int i=0; i<arr.length; i++) {
				arr[i] = arrList.get(i);
			}
		}

    	return arr;
	}
}
  • 배열에서 나누어 떨어지는 값만 저장하기 위해 List 생성.
  • 오름차순으로 정렬해서 return해야 하고,
    List에는 값을 추가하는 순서대로 들어가므로 미리 정렬해놓음.
  • for문으로 divisor로 나누어 떨어지는 값만 List에 차례대로 추가함.
  • 이 때, 나누어 떨어지는 값이 없을 경우 -1을 return해야 함.
    • List의 크기가 0이라면 for문의 결과 나누어 떨어지는 값이 없다는 뜻.
    • 파라미터에 int[] arr배열이 선언되어 있으므로 바로 생성 및 초기화 함.
    • -1을 return해야 하므로 배열의 크기는 1.
  • 나누어 떨어지는 값이 있어서 List에 차례대로 잘 저장이 되었을 경우,
    List에 있는 값을 다시 int[] 배열로 옮겨와야 함.
    • arr 배열 생성 및 초기화, 이때 배열의 크기는 List의 크기만큼.
    • List에 있는 원소를 꺼내서 배열에 저장.

2. 배열 & 향상된 for문

class Solution {
	public int[] solution(int[] arr, int divisor) {
    
    	Arrays.sort(arr);
        List<Integer> list = new ArrayList<Integer>();

        for(int item : arr) {
            if(item % divisor == 0) {
                list.add(item);
            }
        }

        if(list.size() == 0) {
            int[] answer = { -1 };
            return answer;
        }

        int[] answer = new int[list.size()];
        for(int i = 0; i < lstSize; ++i) {
            answer[i] = lst1.get(i);
        }

        return answer;
    }
}    
  • 향상된 for문을 사용하여 배열 arr의 원소를 차례대로 item에 저장하고
    divisor로 나누어 떨어지는 수만 list에 담음.
  • list의 크기가 0이면 나누어 떨어지는 수가 없다는 뜻, -1을 return해야 함.
    • int[] 배열 arr을 새로 생성하여 초기화까지 진행하고 바로 return.
  • 이제 나누어 떨어지는 수가 담긴 list를 int[] 배열로 옮겨줘야 함.
  • int[] 배열 answer을 새로 생성하고 크기는 list의 크기와 같음.
  • for문을 list의 크기만큼 돌려서 list의 원소를 꺼내 배열 answer에 저장.
  • 배열을 어느 위치에서 선언하고 다시 생성 및 초기화하는지 활용하면 좋을 듯.
  • 변수를 생성, 선언 및 초기화하는것 처럼 배열도 잘 활용해보기.

3. Stream

class Solution {
	public int[] solution(int[] arr, int divisor) {
    
    	int[] answer = Arrays.stream(arr)
        				     .filter(i -> i % divisor == 0).toArray();
        Arrays.sort(answer);

        int cnt = (int)answer.length;
        if (cnt == 0) return new int[] {-1};
        
        return answer;
    }
}    
  • 해당 조건에 맞는 스트림을 배열로 변환해서 바로 구함.
  • i를 divisor로 나누어 떨어지는 요소들만 모아 toArray(), 배열로 변환.
  • Arrays.sort() 메서드로 배열 오름차순 정렬.
    • 배열로 변환하기 전에 스트림 자체에서 sorted() 메서드로 정렬 시 실행속도가 늘어남.
  • 배열의 길이를 변수 cnt에 저장하고 배열 길이가 0이라면 -1을 가지는 배열을,
    아니면 배열 answer을 return.






💭마무리

  • Level_1 / 31:56
  • Point
    – 배열의 선언 / 생성 / 초기화 시점
    – 배열과 리스트의 값 주고받기
    – Stream의 Filter 기능

흠~~확실히 배열은 어느 위치에서 선언하고 초기화까지 하느냐에 따라 효율이 좀 차이나는 것 같기도~~🤔 선언만 해두고 초기화는 나중에 한다던가 하는,,,🤔
처음에 문제 풀 때는 배열과 리스트를 사용해서 풀어야겠다고 생각했었다.
아무래도 배열과 리스트에서 사용할 수 있는 메서드가 각자 다르기 때문에 이 둘을 이용한 값 주고받기로 풀었는데 역시...스트림만한게 없다;;;🙂;;;;
스트림을 사용하면 이렇게 가독성 좋고 깔끔하게 풀리는 것을....
절대로 놓을 수 없는 스트림....계속 사용해봐야겠다!!!🤓🤓🤓


profile
Here And Now

0개의 댓글