주어진 기본틀 :
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)에서도 분명히 반복문이 사용될 것이라
마음에 들지 않는다...
'문제 풀기 > C#' 카테고리의 다른 글
27. 핸드폰 번호 가리기 (0) | 2025.01.16 |
---|---|
26. 음양 더하기 (0) | 2025.01.16 |
24. 서울에서 김서방 찾기(Array.IndexOf(), Array.FindIndex() 함수) (0) | 2025.01.15 |
23. 콜라츠 추측 (1) | 2025.01.15 |
22. 두 정수 사이의 합 (Math Class 사용 방법) (1) | 2025.01.15 |