[연습문제] 나누어 떨어지는 숫자 배열

2024. 10. 29. 18:00입문문제

https://school.programmers.co.kr/learn/courses/30/lessons/12910

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


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


제한사항

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

입출력 예

arr divisor return
[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]을 리턴합니다.

주어진 배열 array의 각 원소들 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 구하는 문제입니다.

 

이번 문제는 C언어로 풀 수 없기 때문에(제한), 자바로 문제를 풀어보겠습니다.

파이썬으로는 간단하게 풀 방법이 생각나는데, 자바로 구현하려니 잘 생각나질 않네요.

제가 생각한 방법은 다음과 같습니다.

 

1. 배열 array를 오름차순으로 정렬한다.

2. 정렬된 배열을 반복문을 통해 원소들이 divisor로 나누어 떨어지는지 확인한다.

3. 해당하는 원소들을 answer 배열에 삽입한다.

 

정답 코드를 작성해보겠습니다.

 

1. 자바

import java.util.Arrays;
import java.util.ArrayList;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        // ArrayList를 선언합니다.
        ArrayList<Integer> list = new ArrayList<Integer>();
        // arr을 오름차순 정렬합니다.
        Arrays.sort(arr);
        // 반복문을 사용해 리스트에 값을 채워넣습니다.
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % divisor == 0) {
                list.add(arr[i]);
            }
        }
        // 리스트가 비어있다면
        if (list.isEmpty()) {
            // -1이 담긴 배열을 반환합니다.
            return new int[]{-1};
        }
        // 리스트가 비어있지 않다면
        int[] answer = list.stream().mapToInt(Integer::intValue).toArray();
        return answer;
    }
}

 

자바의 배열은 값을 추가하기가 어려우니 ArrayList를 활용했습니다.

나누어 떨어지는 값들만 리스트에 추가한 뒤, 리스트가 비어있다면 [-1]을, 비어있지 않다면 ArrayList를 Array로 변환한 배열을 반환합니다.

 

2. 파이썬

def solution(arr, divisor):
    answer = sorted([ar for ar in arr if not ar % divisor])
    return answer or [-1]

 

파이썬은 두 줄이면 충분합니다.

리스트 컴프리헨션을 사용해 arr의 원소를 ar로 가져온 뒤, divisor로 나누어 떨어지는 값들만 리스트로 저장합니다.

그 다음, sorted 함수를 사용해 리스트를 오름차순 정렬해주면 기본 작업이 끝납니다.

 

이후에는 answer or [-1]을 사용해 answer가 비어있지 않다면 그대로 answer을, 비어있다면 [-1]을 반환하게 됩니다.