문제
array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
< 제한사항 >
- arr은 자연수를 담은 배열입니다.
- 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
- divisor는 자연수입니다.
- array는 길이 1 이상인 배열입니다.
- 출력 예시 -
정답 코드
< 내 정답 코드 >
class Solution {
public int[] solution(int[] arr, int divisor) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
if (arr[i] % divisor == 0) {
list.add(arr[i]);
}
}
if (list.size() == 0) {
return new int[] {-1};
}
Collections.sort(list);
int[] resultArr = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
resultArr[i] = list.get(i).intValue();
}
return resultArr;
}
}
< 리팩터링 이후 코드 >
class Solution {
public int[] solution(int[] arr, int divisor) {
List<Integer> answerList = divideNumber(arr, divisor);
isEmpty(answerList);
Collections.sort(answerList);
return listToArray(answerList);
}
private static int[] listToArray(List<Integer> answerList) {
int[] tempAnswer = new int[answerList.size()];
for (int i = 0; i < tempAnswer.length; i++) {
tempAnswer[i] = answerList.get(i);
}
return tempAnswer;
}
private static void isEmpty(List<Integer> answerList) {
if (answerList.isEmpty()) {
answerList.add(-1);
}
}
private static List<Integer> divideNumber(int[] arr, int divisor) {
List<Integer> tempList = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
int number = arr[i];
checkNumber(tempList, number, divisor);
}
return tempList;
}
private static void checkNumber(List<Integer> tempList, int number, int divisor) {
if (number % divisor == 0) {
tempList.add(number);
}
}
}
< 타인 답변 코드 >
class Divisible {
public int[] divisible(int[] array, int divisor) {
int[] temp = new int[array.length];
int i = 0;
for(int d : array){
if(d % divisor == 0){
temp[i] = d;
++i;
}
}
int[] ret = new int[i];
System.arraycopy(temp, 0, ret, 0, ret.length);
return ret;
}
}
이것을 주의하자!
- 배열은 한 번 만들어진 크기를 변경할 수 없으므로 몇 개의 수가 저장될지 모르는 초반에 ArrayList< Integer > 을 만들었고, 해당 조건에 맞는 원소들을 저장했다. 그리고 정렬 메서드를 사용한 다음에 하나씩 꺼내서 int [ ] 배열에 저장한 다음 반환했다.
- 배열을 리스트로 바꾸는 메서드 'Arrays.asList( )'는 오토박싱 기능이 없다. 따라서 String 또는 다른 객체로 이뤄진 배열을 리스트로 바꿔줄 수는 있지만, int , long , float, char 같은 원시형(primative) 배열은 제대로 변환이 안된다. 따라서 원시형 배열을 리스트로 변환하려면 순수 for 문을 이용해 대입해줘야 한다.
- 리스트를 원시형(primative) 배열로 바꿀때도 toArray( ) 메서드가 아닌, for 문으로 하나씩 배열에 대입해줘야 한다. 이때 intValue( ) 메서드를 사용하지 않아도 자동으로 Integer 형에서 int 형으로 전환된다.
- 타인 답변 코드에서는 컬렉션 프레임워크를 사용하지 않고, 배열의 복사 기능으로만 풀었다. 이것도 참신해서 가져왔다.
'코딩 테스트' 카테고리의 다른 글
[프로그래머스] (Lv.1) 다트 게임 ** (0) | 2022.09.02 |
---|---|
[프로그래머스] (Lv.1) 가운데 글자 가져오기 (0) | 2022.09.01 |
[프로그래머스] (Lv.1) 두 정수 사이의 합 * (0) | 2022.09.01 |
[프로그래머스] (Lv.1) 문자열 내 마음대로 정렬하기 ** (0) | 2022.09.01 |
[프로그래머스] (Lv.1) 문자열 내 p와 y의 개수 (0) | 2022.09.01 |