[백준] 4673: 셀프 넘버 - JS (브루트포스)

Algorithm/BackJun 2023. 8. 5.
반응형

 
  목 차

  • 문제
  • 접근 방식
  • 풀이

 


  문제

 
n <= 10000 인 셀프 넘버를 출력하는 프로그램을 작성하시오.
 
더보기: 전체 문제 보기

 
 

  접근 방식

 
먼저 10000 이하 라는 조건이 있으니, 배열을 10000개를 false로 채워준다.
그리고 for문을 사용해 생성사가 있는 인덱스의 값을 true로 바꿔주면 값이 false인 인덱스는 셀프 넘버가 되는 것이다.
 

  풀이

 
⚠️주의: 학습을 위해 최소한의 메서드를 사용하여 작성하여 코드가 다소 길어질 수 있다. (해당하는 메서드는 주석으로 작성함.)
 
 
fillArray 함수: new Array(10000).fill(false) 와 같은 역할을 한다.
devide 함수: 인자로 전달된 수를 쪼개서 배열로 리턴하는 함수.
 
10000은 true이기에 패스하고, if문의 조건식이 하나이기에 큰 수 부터 작은 수 순서대로 else if 문을 활용하여 작성하며 내려갔다.
만약 그냥 if 문으로 작성하게 된다면, 100 이상의 셀프 넘버는 모두 true로 되는 상황이 발생한다.
 

function d() {
  const selfNums = fillArray(10000, false);  // new Array(10000).fill(false) 와 같음
  
  for (let i = 1; i <= 10000; i++) {
    if (i == 10000) { continue;
    };
    if (i >= 1000) {
      const devided = devide(i);  // 인자로 전달된 숫자를 쪼개어 배열로 전달하는 함수
      selfNums[(i + devided[0] + devided[1] + devided[2] + devided[3]) - 1] = true;
    }
    else if (i >= 100) {
      const devided = devide(i);
      selfNums[(i + devided[0] + devided[1] + devided[2]) - 1] = true;
    }
    else if (i >= 10) {
      const devided = devide(i);
      selfNums[(i + devided[0] + devided[1]) - 1] = true;
    }
    else if (i <= 9) {
      selfNums[(i + i) - 1] = true;
    };
    if(selfNums[i - 1] == false) {
      console.log(i);
    };
  };
};

d();

 
 
 
더 훌륭한 알고리즘이 있을 수 밖에 없지만, 내 방식을 작성한 것 뿐이다.

반응형