상세 컨텐츠

본문 제목

[프로그래머스] Lv.0 - n의 배수 고르기

알고리즘/프로그래머스

by 으노로 2023. 3. 1. 02:08

본문

안녕하세요.

오늘은 프로그래머스의 코딩테스트 lv.0 단계 중에 n의 배수 고르기를 공부해보겠습니다.

언어는 Java로 구현하였습니다.

 

문제 설명

정수 n과 정수 배열 numlist가 매개변수로 주어질 때, numlist에서 n의 배수가 아닌 수들을 제거한 배열을 return 하도록 solution 함수를 완성해주세요.

 

제한 사항

  • 1 ≤ n ≤ 10,000
  • 1 ≤ numlist의 크기 ≤ 100
  • 1 ≤ numlist의 원소 ≤ 100,000

입출력 예

n numlist result
3 [4, 5, 6, 7, 8, 9, 10, 11, 12] [6, 9, 12]
5 [1, 9, 3, 10, 13, 5] [10, 5]
12 [2, 100, 120, 600, 12, 12] [120, 600, 12, 12]

문제 풀이

매개변수 배열 numlist에서 매개변수 n의 배수만 가져오기 위해 반복문을 통해 배수의 값을 하나씩 가져와서 해당 값이 n의 배수인지 확인하여 n의 배수만 리스트에 추가하여 n의 배수만 담긴 리스트를 만든 후에 리스트를 다시 배열로 담도록 구현하였습니다.

  1. n의 배수만 담을 List를 선언한다.
  2. 매개변수 numlist를 반복문을 통해 하나씩 매개변수 n의 배수 여부를 확인한다.
  3. n의 배수로 확인된 값을 List에 추가한다.
  4. n의 배수만 담긴 List의 크기와 동일한 배열을 선언한다.
  5. List의 값을 반복문을 통해 배열에 담는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.*;
 
class Solution {
    public int[] solution(int n, int[] numlist) {
        List<Integer> list = new ArrayList<Integer>();
        
        for(int i = 0; i < numlist.length; i++)
        {
            if((numlist[i] % n) == 0)
            {
                list.add(numlist[i]);
            }
        }
        
        int[] answer = new int[list.size()];
        
        for(int i = 0; i < list.size(); i++)
        {
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}

n의 배수는 n으로 나누어 떨어지기 때문에 numlist의 값을 n으로 나눈 나머지가 0인 값을 확인하였습니다.

 

추가 풀이

위의 방식은 정답이지만 return 타입이 List가 아닌 Array이고 Array는 선언 시에 크기 할당이 필요하고 numlist의 값들에서 n의 배수의 개수만큼 크기 할당이 필요합니다.

그래서 numlist에서 n의 배수만 List에 담은 후에 List를 다시 Array에 담기 위해 반복문을 두 번 실행해야합니다.

반복문을 두 번 실행해야 하는 것을 줄이기 위해 공부하니 Stream(스트림)을 사용하여 구현하는 방법이 있었습니다.

1
2
3
4
5
6
7
8
9
import java.util.*;
 
class Solution {
    public int[] solution(int n, int[] numlist) {
        int[] answer = Arrays.stream(numlist).filter(value -> value % n == 0).toArray();
        
        return answer;
    }
}

Stream의 filter()를 이용하여 numlist의 값들 중에 n으로 나눈 나머지가 0인 값들을 분류하고 toArray()로 배열로 변환하면 반복문을 두 번 사용하지 않고 더욱 간단하게 구현할 수 있었습니다.


사용 함수

  • filter()
    • Stream의 값들을 하나씩 입력된 조건에 포함되는지 여부를 확인하는 함수
  • toArray()
    • Stream을 Array로 변환하는 함수

 

마무리 정리

반복문과 조건문만을 사용하여 해결하기보다는 Steam 등 코드를 줄일 수 있는 방법도 고민해보면 좋을 것 같습니다.

Stram에 대한 이론과 사용법은 참조된 글들에서 추가로 공부해야겠습니다.

이상으로 프로그래머스 Lv.0 - n의 배수 고르기 공부를 마치겠습니다.

감사합니다.

 

참조 : https://futurecreator.github.io/2018/08/26/java-8-streams/

참조 : https://developer-talk.tistory.com/765

관련글 더보기

댓글 영역