[프로그래머스] 짝수 홀수 개수

최유나·2025년 7월 21일
0

프로그래머스

목록 보기
54/55

✨ 짝수 홀수 개수

나의 풀이

✅ 문제 요약

num_list에서 짝수의 개수와 홀수의 개수를 [짝수, 홀수] 배열 형태로 반환하는 함수

function solution(num_list) {
  let answer = [];
  let newArr = [];
  for (let i = 0; i < num_list.length; i++) {
    if (num_list[i] % 2 === 0) newArr.push(i);
  }
  return answer = [newArr.length, num_list.length - newArr.length];
}

(for + push) : 의도는 짝수의 개수를 세는 것이나 newArr.push(i)로 짝수의 값이 아닌 인덱스를 저장하고 있어서 개선이 필요함
짝수의 개수가 카운트라면 push() 자체가 불필요하므로 더 간단한 방식으로 개선 해야함

✅ 시간복잡도

for 루프는 num_list 를 한 번 순회 -> O(n)
newArr.push()는 배열 끝에 요소를 추가 -> 평균 O(1)
newArr.length, num_list.length -> O(1)

👉 총 시간복잡도: O(n) : 상수 시간

✅ 공간복잡도

newArr에 짝수 인덱스만 저장 -> 최악의 경우 모든 요소가 짝수라면 O(n) 공간 사용

👉 총 공간복잡도: O(n)

✅ 개선 포인트 (메모리 최적화)

javascript
function solution(num_list) {
  let even = 0;
  for(let i = 0; i < num_list.length; i++){
  	if(num_list[i] % 2 === 0) even++
  }
  return [even, num_list.length - even]
  • 불필요한 배열(newArr) 제거
  • 메모리 O(1)로 최적화됨
  • 가독성 향상

✅ 최적 코드 시간/공간 복잡도

  • 시간복잡도: O(n)
  • 공간복잡도: O(1)

✅ 고차함수 활용(forEach / reduce)

javascript
function solution(num_list) {
  let even = 0;
  num_list.forEach((n)=> n % 2 ===0 && even++)
  return [even, num_list.length - even]
}

🔍 해석

  • even 짝수 카운터의 초기값을 0으로 표새하여 변수를 담을 그릇을 만든 다음,
  • forEach로 num_list 배열을 하나씩 순회하며 n이 짝수일 경우 even++
  • even = 짝수 개수이니, 전체 개수에서 뺴면 홀수 개수 = num_list.length -even
  • [짝수, 홀수] 형태로 변환
javascript
function solution(num_list) {
  let even = 0;
  num_list.reduce(([even, odd], cur)=> cur % 2 === 0 ? [even +1, odd] : [even, odd + 1],[0, 0])
  return [even, odd];
}

🔍 해석

  • reduce() 는 누적값 [evne, odd]를 유지하면서 cur값을 하나씩 검사
  • cur이 짝수 -> [even + 1, odd]
  • cur이 홀수 -> [even, odd + 1]
  • 초기 값은 [0, 0] (짝수 0개, 홀수 0개)

✅ 결론

둘 다 시간복잡도 O(n) / 공간복잡도 O(1)로 효율은 같음

0개의 댓글