Algorithm/Java

프로그래머스 - 나누어 떨어지는 숫자 배열 java

고고마코드 2022. 7. 1. 16:23
반응형
12910번

코딩테스트 연습 - 나누어 떨어지는 숫자 배열 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 나누어 떨어지는 숫자 배열

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

programmers.co.kr


풀이

나누어 떨어지는 ▶ 나누어서 나머지가 0이 나오는 요소만 찾기!
✔ 주의할 점은 배열은 나누어 떨어지는 요소가 없으면 배열에 { -1 } 을 담아 리턴해야 한다는 점입니다.

그리고 이 나누어 떨어진 값들도 정렬을 해야 합니다.

 

  • 풀이1
public int[] solution(int[] arr, int divisor) {
	int[] answer = Arrays.stream(arr).filter(i -> i % divisor == 0).sorted().toArray();
	return answer.length == 0 ? new int[] { -1 } : answer;
}

stream을 조금 사용해 보았다면 아주 쉽게 풀 수 있는 문제입니다.

 

IntStream java.util.Arrays.stream(int[] array)

배열을 stream 형태로 만들 수 있어요!

만약 그냥 Stream.of(arr) 이런 식으로 쓰게 되면 int[] 타입의 stream이 만들어져서 원하는 결과가 아닐 거예요...ㅜㅜ

✅ 먼저 filter를 통해 divisor로 나누어 떨어지는 값들만 걸러내요.

✅ stream에서는 sorted()를 통해 간단하게 정렬도 할 수 있죠.

✅ 만들어진 stream을 toArray()를 통해 다시 배열로 반환합니다. 참고로 우리가 만든 stream은 IntStream이기 때문에 자동으로 int[] 로 반환됩니다.

 

✔ 테스트 케이스 처리속도: 평균 4ms / 최대 6.74ms

 

  • 풀이2
public int[] solution(int[] arr, int divisor) {
	List<Integer> list = new ArrayList<Integer>();
	for (int i : arr) {
		if (i % divisor == 0) list.add(i);
	}
	list.sort( (a, b) -> { return a - b; } );

	int[] answer;
	if (list.isEmpty()) {
		answer = new int[] { -1 };
	} else {
		answer = new int[list.size()];
		for (int i = 0; i < list.size(); i++) answer[i] = list.get(i);
	}

	return answer;
}

풀이1의 처리속도가 너무 마음에 안 들더라구요... 그래서 처리속도 좀 줄여보려고 풀이2로 풀었어요.

속도가 지연되는 건 안 쓰려고 한 풀이입니다.

 

우선 나누어 떨어지는 요소만 list에 담아둡니다.

정리된 list를 오름차순으로 정렬하고

다시 배열로 변환해서 반환하면 끝입니다.

 

✔ 테스트 케이스 처리속도: 평균 0.8ms / 최대 2ms

반응형