24.02.06 TIL - 알고리즘 : 프로그래머스, 나누어 떨어지는 숫자 배열 | 배열의 필터링

JJwoo·2024년 2월 13일

알고리즘

목록 보기
10/18

1. 풀이

using System.Collections.Generic;
using System;
public class Solution {
    public int[] solution(int[] arr, int divisor) {
        int[] answer = new int[] {};
        List<int> list = new List<int>();
        for(int i=0;i<arr.Length; i++)
        {
            if(arr[i]%divisor==0)
                list.Add(arr[i]);
        }
        if(list.Count==0)
            list.Add(-1);
        answer=list.ToArray();
        System.Array.Sort(answer);
        return answer;
    }
}

코드 개념

  • 정수 배열 arr과 나누는 수 divisor를 입력 받아 배열 내의 요소 중 divisor로 나누어 떨어지는 수만을 추출해 새로운 배열을 만들고, 오름차순으로 정렬하여 반환.

  • divisor로 나누어 떨어지는 요소가 하나도 없다면 배열에 -1을 담아 반환

코드 작동 방식

  1. 변수 초기화 : 빈 배열 answer와 정수 리스트 list를 초기화, list는 나중에 조건에 맞는 요소를 저장하기 위해 사용

  2. 배열 순회 : 입력 배열 arr의 각 요소를 순회하며, divisor로 나누어 떨어지는지 확인.

  3. 조건 검사 : 요소가 divisor로 나누어 떨어지면(arr[i] % divisor == 0), 해당 요소를 list에 추가

  1. 결과 처리: 순회 뒤에 list가 비어있으면 -1을 추가, 그렇지 않으면 list를 배열로 변환하여 answer에 할당.

  2. 배열 정렬: Array.Sort 메서드를 사용하여 answer 배열을 오름차순으로 정렬

이후 결과 반환.

초보 관점에서

  • 변수 사용 이해

    • list : 유동적인 데이터 추가
  • 조건문 사용 : % 연산자로 나누어 떨어지는지 아닌지 판별함

  • 동적 배열과 정적 배열의 차이 : List와 배열의 차이 및 활용 차이

  • List<int>는 요소 추가가 자유롭고, .ToArray() 메서드를 통해 배열로 쉽게 변환

  • 정렬 알고리즘 : Array.Sort는 배열을 오름차순으로 정렬

2. 다른 풀이 : Linq 사용

using System;
using System.Linq;

public class Solution {
    public int[] solution(int[] arr, int divisor) {
        var filtered = arr.Where(x => x % divisor == 0).OrderBy(x => x).ToArray();
        return filtered.Length > 0 ? filtered : new[] {-1};
    }
}
  • LINQ를 사용하여 한 줄로 배열을 필터링(Arr.Where)하고, 정렬(OrderBy)

  • LINQ를 사용하면 수동으로 리스트와 배열을 다루는 코드 작업이 줄어 더 깔끔하고 읽기 쉬워보인다.

3. 배열의 필터링

주어진 배열에서 특정 조건을 만족하는 요소만을 선택하는 과정

'2. 다른 풀이' 에서는 Linq의 Arr.Where를 사용 했으며,

기본적인 방법은 반복문을 사용하는 편이다.


A. 반복문 사용 필터링

배열을 순회하며 각 요소가 특정 조건에 부합하는지 검사하고, 조건에 맞는 다면 그 요소만 컬렉션(배열 or 리스트)에 추가.

List<int> filtered = new List<int>();
foreach (int element in arr) {
    if (element % 2 == 0) { // 짝수인 경우
        filtered.Add(element);
    }
}
  • 정수 배열에서 짝수만을 추출해야 하므로, 배열을 순회하면서 각 요소를 2로 나눈 나머지가 0인지 확인하고( % 연산자 ) 나머지가 0이면 해당 요소를 새 리스트에 추가

B. LINQ를 사용한 필터링

using System.Linq;
...
var filtered = arr.Where(x => x % 2 == 0).ToList();

Where 메서드를 사용하여 배열이나 리스트에서 조건을 만족하는 요소만을 선택하고 내부적으로 반복문을 사용

  • x => x % 2 == 0 -> 각 요소 x에 대한 필터링 조건
profile
개발 모코코

0개의 댓글