문제 풀기/C#

25. 나누어 떨어지는 숫자 배열( .Where() 함수, 배열 생성 및 값 할당 )

kagan-draca 2025. 1. 16. 13:55

 

주어진 기본틀 : 

 

public class Solution {
    public int[] solution(int[] arr, int divisor) {
        int[] answer = new int[] {};
        return answer;
    }
}

 

문제를 보고 Select 함수를 사용해

 

arr.Select(element => element % divisor == 0).OrderBy(element => element).ToArray();

 

로 문제를 간단히 해결할 수 있을 것이라 생각했다.

 

하지만, 여기에는 2가지 오류가 존재했다.

 

첫 번째 오류는 Select는 콜백 함수의 결과( element % divisor == 0 )가 참(true)인지, 거짓(false)인지 판별하는 함수라

ToArray()로 배열 형식으로 만들 경우 bool[] 타입의 배열이 만들어지게 된다.

 

그래서, Select를 사용하는 대신 예전에 다른 사람의 코드에서 얼핏 본

 

Where 함수를 사용해 봤다.

그 결과,

 

 

무난하게 divisor로 나눠 떨어지는 숫자들의 배열을 추출할 수 있었다.

 

하지만, divisor로 나눠 떨어지지 않는 숫자에 대한 배열인 [-1]은 만들어내지 못 했다.

 

return temps.Length == 0 ? [-1] : temps;

 

간단하게 꼼수로 위와 같이 결과를 반환하는 return 문에서

 

temps 배열의 길이가 0일 경우, [-1]을 반환해주고자 했다.

 

하지만, 위의 코드를 실행하면 오류가 발생하게 됐다.

 

그 이유로는, C 계열, Java은 정적 언어로 배열의 길이를 지정해줘야 사용할 수 있기 때문이다.

 

이를 해결하기 위해서는 List<int> 와 같이 리스트를 사용하거나, [-1]이 아니면서 삼항연산자에서

[-1]이 담긴 int 형 배열을 반환 시킬 방법을 찾아야 했다.

 

그래서, 인터넷에 찾아 본 결과

 

비교적 간단하게 위와 같은 문제를 해결할 수 있었다.

 

방법으로는,

 

return temps.Length == 0 ? new int[] { -1 } : temps;

 

new 연산자를 사용해 int 형 배열을 선언할 때 선언과 동시에 {}를 활용하여 -1을

 

int 형 배열에 담아주는 방법이었다.

 

(다 배웠던 내용이라 머리 속에는 있지만 참... 그것을 활용하는 것은 능력인 것 같다...)

(아직 갈 길이 멀다...)

 

그 결과 : 

 

using System;
using System.Linq;

public class Solution {
    public int[] solution(int[] arr, int divisor) 
    {
        int[] temps = arr.Where(element => element % divisor == 0).OrderBy(element => element).ToArray();
        return temps.Length == 0 ? new int[] { -1 } : temps; 
    }
}

 

위와 같이 코드가 작성 됐고,

 

 

모든 테스트 케이스를 통과할 수 있었다.

 

하지만, 수행시간 측면에서 Where(element => element % divisor == 0)를 수행하는데 분명히

 

반복문이 사용될 것이고,

 

OrderBy(element => element)에서도 분명히 반복문이 사용될 것이라

 

마음에 들지 않는다...