[TIL] 240914 (프로그래머스 숫자의 표현)

·2024년 9월 14일

TIL

목록 보기
159/268
post-thumbnail

🥞 오늘 한 일

  • 알고리즘 코드카타
    • 숫자의 표현

알고리즘 코드카타

숫자의 표현

문제

Finn은 요즘 수학공부에 빠져 있습니다. 수학 공부를 하던 Finn은 자연수 n을 연속한 자연수들로 표현 하는 방법이 여러개라는 사실을 알게 되었습니다. 예를들어 15는 다음과 같이 4가지로 표현 할 수 있습니다.

  • 1 + 2 + 3 + 4 + 5 = 15
  • 4 + 5 + 6 = 15
  • 7 + 8 = 15
  • 15 = 15

자연수 n이 매개변수로 주어질 때, 연속된 자연수들로 n을 표현하는 방법의 수를 return하는 solution를 완성해주세요.

풀이

정확성 테스트에서는 처음부터 통과됐지만 효율성 테스트에서 자꾸 실패했던 코드였다.

STEP 1

function solution(n) {
  let result = 1;
  for (let i = 1; i <= Math.floor(n / 2); i++) {
    let num = i;
    for (let j = i + 1; j <= Math.ceil(n / 2); j++) {
      num += j;
      if (num === n) {
        result++;
      } else if (num > n) {
        break;
      }
    }
  }
  return result;
}

반복문을 두 번 돌려서 답을 얻어낸 방식이었다.
이 경우 Math로 계산을 두 번이나 해줘야하기도 하고, 두번째 반복문을 for문으로 돌리는게 살짝 애매한 지점(j의 조건을 정해주는 부분에서)이 있기도 해서 while문으로 변경했다.

STEP 2

function solution(n) {
  let result = 1;
  for (let i = 1; i <= Math.floor(n / 2); i++) {
    let num = i;
    let j = i + 1;
    while (num < n) {
      num += j;
      if (num === n) {
        result++;
        break;
      } else if (num > n) {
        break;
      }
      j++;
    }
  }
  return result;
}

이 방식을 사용해도 효율성에서 문제가 생기기에, Math.floor로 계산해주는 부분을 따로 변수로 빼는 방식을 사용해보았다.

STEP 3

function solution(n) {
  let result = 1;
  const floorNum = Math.floor(n / 2);
  for (let i = 1; i <= floorNum; i++) {
    let num = i;
    let j = i + 1;
    while (num < n) {
      num += j;
      if (num === n) {
        result++;
        break;
      } else if (num > n) {
        break;
      }
      j++;
    }
  }
  return result;
}

이렇게 변수로 만들어 해당 변수를 조건문에 넣어주니 문제가 해결되었다.

profile
웹 프론트엔드 개발자

0개의 댓글