코딩 테스트/Programmers - 1

[JS] 나누어 떨어지는 숫자 배열

hayeonn 2022. 9. 21. 18:33
반응형

 

[처음 푼 풀이]

function solution(arr, divisor) {
  let newArr = [];

  for (let i = 0; i < arr.length; i++) {
    if (arr[i] % divisor === 0) {
      newArr.push(arr[i]);
      newArr.sort();
    } 
    else {
    	newArr.push(-1);
    }
  }
  return newArr;
}

1. 새로운 배열을 받아줄 newArr 변수를 설정함.

2. for문을 돌려서 arr[i]가 divisor로 나눠진다면, newArr에 push를 해 값을 배열에 넣어줌.

3. 그리고 그 값들을 sort를 이용해 오름차순으로 정렬해줌.

4. 만약 divisor로 나누어 떨어지지 않으면 newArr에 -1을 push함.

 

그런데, 여기서 첫번째 예시가 통과되지 못함. 

리턴값이 계속 [10, 5] 가 나왔던 것!

→ 이유: "10" 에서 "1" 이 "5" 보다 작았기 때문

 

세번째 예시는 [-1, -1, -1]이 리턴됨

→ 이유: [3, 2, 6]이 10으로 나누어지지 않기 때문에 배열 안의 값을 모두 -1로 대체, 따라서 [-1, -1, -1]이 리턴될 것.

 

[두번째 풀이]

function solution(arr, divisor) {
  let newArr = [];

  for (let i = 0; i < arr.length; i++) {
    if (arr[i] % divisor === 0) {
      newArr.push(arr[i]);
      newArr.sort((a, b) => a - b);
    }
  }
  if (newArr.length === 0) {
    newArr.push(-1);
  }
  return newArr;
}

따라서, 단순히 newArr.sort()가 아닌 newArr.sort((a, b) => a - b) 를 해줘야함

그러면 첫번째 예시의 값대로 [5, 10] 이 나오게 됨 (컴퓨터 입장에서 생각할 것!)

 

또, 단순히 for문 안에서 else { newArr.push(-1) } 해버리면 모든 수를 다 -1 로 바꿔서 넣어버리기 때문에 안됨

그래서 for문 밖에서 newArr 배열의 길이가 0 일때 -1 로 처리하면 되는 것..

newArr 배열 길이가 0 이라는 것은 arr를 divisor로 나눴을 때 어떤 수도 나누어떨어지지 않는다는 의미

 

 

[코드 리뷰]

function solution(arr, divisor) {
  let newArr = [];
    
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] % divisor === 0) {
      newArr.push(arr[i]);
    }
  }
  
  newArr.sort((a, b) => a - b);
  
  if (newArr.length === 0) {
    return [-1]
  }
  return newArr;
}

1. 먼저 for문에서 arr 안의 값을 divisor로 나눴을 때 나누어떨어지는 수를 배열에 넣고

2. for문 밖에서 newArr를 오름차순 정리하면 됨!

이유 : for문을 돌릴 때마다 sort()를 실행하는 것은 비효율적. 

모든 for문을 돌리고 sort()를 한번 실행해도 똑같은 값이 도출됨.

3. return newArr.push(-1) 를 그냥 return [-1] 해도 같은 결과가 나옴