문제 설명
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 |
짝짝...이런 코드가 자연스럽게 나오시는 분들은 얼마나 공부를 한 것 일까 ㅠㅠ..더 노력해야겠다.
'알고리즘 > 코딩 - 프로그래머스' 카테고리의 다른 글
[Java][프로그래머스][Level 1] 문자열 내 p와 y의 개수 (0) | 2019.03.28 |
---|---|
[Java][프로그래머스][Level 1] 문자열 내 마음대로 정렬하기 (1) | 2019.03.27 |
[Java][프로그래머스][Level 1] 같은 숫자는 싫어! (0) | 2019.03.24 |
[Java][프로그래머스][Level 1] 가운데 글자 가져오기 (0) | 2019.03.24 |
[Java][프로그래머스][Level 1] 2016년 (0) | 2019.03.24 |