2019년 1월 21일 월요일

#9 알고리즘 연습 - 나누어 떨어지는 숫자배열-JAVA


나누어 떨어지는 숫자배열


문제 설명
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]을 리턴합니다.



문제풀이 IDEA

조건문을 써서 나누어 떨어지는 수를 판단해서 Array에 넣어 출력하는 것은 어렵지 않으나
1. JAVA에서는 array의 크기를 동적으로 사용할수 없기에
해당하는 수의 갯수를 count한 값을 크기로 array 선언하고
배열을 반복문으로 돌리며 해당하는 원소 출력

혹은

2. ArrayList를 가져와 ArrayList에 해당 원소를 넣고 size를 array의 크기로 설정하여
ArrayList값을 옮겨준다

#2 알고리즘 연습 에서 1번의 방법을 이용했으므로 이번엔 2번을 써보려 한다


🐟다른 코드에서는 나누어 떨어지는 수가 없는 경우의 생각을 안해준 코드(sort도 없다)
    공부용으로 참고만 해서 보자

나의코드⭐

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
27
28
29
30
31
import java.util.ArrayList;
import java.util.Arrays;

class Solution {
  public int[] solution(int[] arr, int divisor) {
      ArrayList<Integer> sol = new ArrayList<Integer>();    

      for (int i = 0 ; i<arr.length; i++){
          if (arr[i]%divisor == 0){                   divisor로 나눈 나머지가 0이면 위에 선언한 ArrayList에 add해서 넣어준다
               sol.add(arr[i]);
          }
      }
      if (sol.size()==0){                              그런데 만약 for문을 다 돌았는데도 ArrayList의 크기가 0이라는 말은
          sol.add(-1);                                  나누어 떨어지는 수가 없었다는 말이므로 반환 값인 -1을 넣어주자
      }

      int sol2[] = new int[sol.size()];                 함수의 return값으로 사용할 sol2를 나누어떨어지는 수가 들어있는 ArrayList의 크기로 선언


      for (int i = 0; i< sol2.length; i++){            
          sol2[i] = sol.get(i).intValue();               ArrayList에서 i번째 index의 값을 가져와 int로 형변환 해서 int[]에 넣어준다
      }
      Arrays.sort(sol2);                                 Arrays의 메서드를 이용해 오름차순으로 정렬해주고
      
      return sol2;                                       리턴해주게 되는데 나누어 떨어지는 수가 없는경우 ArrayList에 -1이 들어가있었으므로
  }                                                      그 값이 sol2에 저장이 되게 된다
}


다른 코드 ⭐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 문제가 개편 되었습니다. 이로 인해 함수 구성이 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
// 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
import java.util.Arrays;

class Divisible {
    public int[] divisible(int[] array, int divisor) {
        //ret에 array에 포함된 정수중, divisor로 나누어 떨어지는 숫자를 순서대로 넣으세요.
        return Arrays.stream(array).filter(factor -> factor % divisor == 0).toArray();
         
        JAVA 8 부터 사용할수 있는 Stream 이라는 기술인데
        array(혹은 컬렉션 인스턴스)에서 데이터들을 읽어들여 stream형태로 반환하는것
        
        위의 코드는 array를 읽어들이는데 filter라는 method를 이용해서 
        factor % divisor == 0 을 만족하는 factor를 람다식으로 돌려주고 
        반환된 애들이 stream으로 반환되는데 toArray를 이용해서 array로 가공해줬다
}
 
}




참고해볼만한 것


나의 코드에서는 ArrayList를 이용해서 코드를 작성해 보았는데
코드 작성의 편의나 효율성에서도
같은 for문을 2번 돌리는 count가 더 좋을것 같다
(왜냐면 ArrayList는 array->ArrayList->array인 반면 count는 array-> array이기때문)

JAVA Stream


자바 8이후의 기술인 stream이라는것을 쓰면

for문과 같은 반복문을 통해 array나 collection을 탐색하는 번거로움을 해소 할수 있다

메서드 및 자세한 설명은  여기 이 블로그를 참고해보자

JAVA lambda 


자바 8 이후부터 도입된 람다식은

익명함수를 생성하기 위한 방법으로 함수형프로그래밍에 적합한 문법방식이다

최근에는 이러한 함수형프로그래밍이 일종의 문법적 트렌드처럼 되고있다.

사용방법은 기본적으로 (타입 매개변수) ->(실행문); 이다

더 궁금하다면
JAVA의 lambda식  을 참고해보면 좋을것 같다

출처:https://programmers.co.kr/

댓글 없음:

댓글 쓰기

가장 많이 본 글