본문 바로가기
알고리즘/코딩 - 프로그래머스

[Java][프로그래머스][Level 1] 나누어 떨어지는 숫자 배열

by 주남2 2019. 3. 25.
반응형

문제 설명


array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.

divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.


제한사항

- arr은 자연수를 담은 배열입니다.

- 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.

- divisor는 자연수입니다.

- array는 길이 1 이상인 배열입니다.


생각


사실 간단한 문제라서 넘어갈까 생각했지만 내 목표는 내가 푼 문제를 정리하는 것이기 때문에 쓰기로 했다.

element들이 있고 divisor이 있으므로 각각 요소를 divisor로 나누어서 나누어 떨어진다면 answer에 넣어주고 아니면 넘어간다. 만약 answer이 비어 있다면 -1을 반환하면 된다.

예를 들어, arr = [7, 8, 14, 30] / divisor = 7 이라면 7과 14가 7로 나누어 떨어지므로, [7 10]을 return해주면 된다.

여기서는 단지 문제를 푸는게 아니라 '어떻게 코드를 줄일 수 있냐'이기 때문에 후에 공부하도록 하겠다.


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.*;
 
class Solution {
      public int[] solution(int[] arr, int divisor) {
          int[] answer = {};
          ArrayList<Integer> a1 = new ArrayList<Integer>();
          
          for(int i=0; i<arr.length; i++) {
              if(arr[i]%divisor==0) a1.add(arr[i]);
          }
          
          if(a1.isEmpty()) {
              a1.add(-1);
          }
          
          answer = new int[a1.size()];
          
          for(int i=0; i<a1.size(); i++) {
              answer[i] = a1.get(i);
          }
          
          Arrays.sort(answer);
          
          return answer;
      }
}
cs

추가 [ Arrays.stream() ]


프로그래머스는 문제를 풀면 다른 사람들의 풀이를 볼 수 있다. (게다가 채점이 매우 빠르고 경과 시간이 나와 굉장히 좋아하는 사이트이다.) 


항상 고수분들의 풀이를 보면 Arrays.stream()이 등장해서 한 문장으로 끝나버리던데..이것에 대해 공부를 하고 싶어졌다.

Arrays.stream() API는 파이썬에서의 람다식과 비슷하다. 자바8 이전에는 for 또는 foreach문을 사용해야 했는데 이렇게 되면 어쩔 수 없이 코드가 길어졌다. 여기에서 쓰일 메소드는 filter() 와 toArray()이다.


Arrays.stream(array, int a1, int a2) 이면 a1부터 (a2-1)까지의 요소를 가져올 수 있다. 이제 여기에 filter가 붙게되면 조건을 걸 수 있다!


Arrays.stream(array).filter(요소 -> 조건)이 들어가는데 ->를 처음 써보게 되어 굉장히 신기했다. 이 문제에서는 나눌 요소가 있는 arr이 divisor로 나누어 떨어지는 것이 조건이므로 아마 filter(element -> element%divisor==0)을 하면 될 것이다. 여기서 element는 자동으로 array의 각 요소로 저장되니까 아무거나 써도 될 듯하다. (확실하지 않음)

후에 배열로 바꿔주는 toArray()를 쓰면 완성!

1
2
3
4
5
6
class Solution {
      public int[] solution(int[] arr, int divisor) {
 
       return Arrays.stream(arr).filter(element -> element%divisor==0).toArray();
      }
}
cs


짝짝...이런 코드가 자연스럽게 나오시는 분들은 얼마나 공부를 한 것 일까 ㅠㅠ..더 노력해야겠다.


반응형