[Programmers] 숫자의 표현 - JavaScript

Joosi_Cool·2023년 2월 5일
0

Programmers

목록 보기
4/98
post-thumbnail

문제설명



설계 과정

설계과정에 있어서, 중간값을 기준으로 삼는 설계를 꾸렸다.
홀수, 짝수 기준으로 중간 값을 구한다. 이 중간값을 기준으로 최소값이 0보다 큰지 확인해주는 설계를 진행했다. 추가적으로 1부터 n까지 모두 체크할 필요 없이, 2/n까지 체크하도록 계산했다. 이때 체크해주는 숫자는 더해지는 숫자의 개수이다. 예를 들어 2+3+4+5는 4가 내가 확인해주는 a의 값이다.


홀수의 경우에는 개수로 나누어지면 그 중간값 기준으로 개수만큼 펼쳐주면 끝이다. 이때 최소값이 0보다 큰지 체크만 해주면 구할 수 있다.
짝수의 경우에는 개수로 나누었을때, 값이 X.5 로 나와야 양 옆으로 펼칠 수 있다. 그 이유는 짝수의 경우에는 6 7 8 9 이런식으로 중간값이 7.5이다 7.5기준으로 똑같이 펼쳐주긴 위해서는 개수로 나누었을때, 양 옆 비율이 같은 X.5로 나와야한다.


이러한 설계 과정으로 본인이 짠 코드는 아래와 같다.
코드는 아래와 같다.



코드 풀이

function solution(n) {
  var answer = 0;
  if (n === 1) {
    return 1;
  }
  // 반부터 체크 그 앞은 확인 안해도 가능
  for (var a = Math.floor(n / 2) + 1; a > 0; a--) {
    if (a % 2 === 1 && n % a == 0 && n / a - Math.floor(a / 2) > 0) {
      answer++;
      console.log(a);
    } else if (
      a % 2 === 0 &&
      n / a - Math.floor(n / a) === 0.5 &&
      n / a - a / 2 > 0
    ) {
      answer++;
    }
  }
  return answer;
}

결과



추가 코드

본인이 이 문제를 풀면서 내가 짠 코드는 아니지만, 여러모로 신기한 코드가 있었다.

function solution(n) {
  var answer = 0;

  for (var i = 1; i <= n; i++) {
    if (n % i == 0 && i % 2 == 1) {
      answer++;
    }
  }
  return answer;
}

이 코드에서 i 는 약수를 의미하고 있다. 이 풀이방법은 정수론 중에 주어진 자연수를 연속되는 자연수들의 합으로 표현할 수 있는 방법의 수는 주어진 자연수의 약수 중에서 홀수인 수의 개수와 같다. 라는 개념을 사용하여 푼 식이다.

내가 짠 코드는 여러가지 숫자(테스트 케이스) 를 입력해보면서 눈치챘던 부분을 코드로 구현한 방법이었다. 하지만 위는 수학의 개념을 활용하여 문제를 풀었다. 이런 개념이 있는지 처음 알았고, 코드도 이런 개념을 알고 있으니 훨씬 더 간단해졌고 너무 신기했다. 이런 수학 문제는 많이 풀어보면서 개념에 대해 깨닫는 것이 중요한 것 같다.

profile
집돌이 FE개발자의 노트

0개의 댓글