알고리즘

[프로그래머스] 다음 큰 숫자 JavaScript

2022. 6. 29. 22:41

문제 링크 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 유형

재귀 (Lv.2)

 

문제 풀이

  • 자연수 N이 있을 때, N에서 2의 제곱인 수 중에서 N보다 작거나 같은 가장 큰 수를 뺀다.
  • 이때, 2의 제곱의 지수에 해당하는 자리는 1이 된다.
  • 재귀적으로 getBinaryLength 함수를 호출하여 2진수를 구하고, 2진수 중 1의 개수를 리턴한다.
  • 자연수 N+1부터 반복하여 N의 2진수의 1의 개수와 같은 자연수를 찾는다.

 

코드

function solution(n) {
	// n의 최대 지수가 최대 인덱스 번호인 배열을 만든다.
	let arr = new Array(Math.floor(Math.log2(n)) + 1).fill(0); 
    const count = getBinaryLength(arr, n);
    
    let start = n + 1; // (n + 1) 부터 2진수를 구한다.
    while (true) {
        let array = new Array(Math.floor(Math.log2(n)) + 1).fill(0);
        let cnt = getBinaryLength(array, start);
        
		// n의 2진수의 1의 개수와 n보다 큰 어떤 수의 2진수의 1의 개수가 같다면 반복문 종료한다.
        if (cnt === count) { 
            break;
        }
        start++;
    }
    return start;
}

// 자연수 n의 2진수의 1의 개수를 구하는 함수
function getBinaryLength(arr, n) {
    if (n === 0) return arr.filter(v => v === 1).length;
    let num = Math.floor(Math.log2(n)); // n보다 작거나 같은 최대 (2 ** num) 값을 찾는다.
    arr[num] = 1; // 해당 지수 인덱스의 진수는 1이다.
    return getBinaryLength(arr, n - 2 ** num);
}

 

느낀 점

 

2진수 구하는 함수를 구현했는데, 알고보니 2진수는 toString()이라는 메소드로 쉽게 구할 수 있었다.

  • toString() 메소드로 2진수를 구하고, 2진수의 1의 갯수를 구하는 함수만 구현하는 것이 더 성능이 좋았다.

 

10진수를 다른 진수로 변환할 때, toString()

  • 특정 객체를 문자열로 변환해줄 때, 쓰이는 것이 보통이다.
  • 하지만, 10진수를 다른 진수로 변환할 때도 쓰인다.
  • radix: 변환할 진수, 인자로 2와 36사이의 정수가 들어간다.
  • numObj.toString([radix]) 결과의 타입은 String이다.
numObj.toString([radix])
  • 특정 객체를 문자열로 변환해줄 때, 쓰이는 것이 보통이다.
  • 하지만, 10진수를 다른 진수로 변환할 때도 쓰인다.
  • radix: 변환할 진수, 인자로 2와 36사이의 정수가 들어간다.
  • numObj.toString([radix]) 결과의 타입은 String이다.

 

추가) 문자열을 특정 진수이자 정수로 변환할 때, parseInt()

parseInt(string) 
parseInt(string, radix)
  • radix: string의 진수를 나타내는 2부터 36까지의 정수이다. Number 자료형이 아닌 경우 Number로 변환한다.

 

참조) toString()을 이용한 코드

function solution (n) {
  const k = count('1', n.toString(2))
  let m = n + 1

  while (count('1', m.toString(2)) !== k) {
    m++
  }

  return m
}

function count (a, bs) {
  let k = 0

  for (const b of bs) {
    if (b === a) k++
  }

  return k
}

 

'알고리즘' 카테고리의 다른 글

[프로그래머스] 메뉴 리뉴얼 JavaScript  (0) 2022.07.08
[백준] 1260 DFS와 BFS node.js  (0) 2022.07.08
[백준] 1932 정수 삼각형 node.js  (0) 2022.07.05
[백준] 10972 다음 순열 node.js  (0) 2022.07.02
[프로그래머스] 문자열 내 마음대로 정렬하기 JavaScript  (0) 2022.06.30
'알고리즘' 카테고리의 다른 글
  • [백준] 1260 DFS와 BFS node.js
  • [백준] 1932 정수 삼각형 node.js
  • [백준] 10972 다음 순열 node.js
  • [프로그래머스] 문자열 내 마음대로 정렬하기 JavaScript
sandwe
sandwe
sandwe
sandwe
sandwe
전체
오늘
어제
  • 분류 전체보기 (69)
    • CSS (1)
    • 알고리즘 (35)
    • JavaScript (30)
      • 모던 자바스크립트 Deep Dive (30)
    • React (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 프로그래머스
  • 클로저
  • 프로토타입
  • Suspense
  • 해쉬 맵
  • 백트래킹
  • 알고리즘
  • 투 포인터
  • Leetcode
  • React Query
  • 선언적
  • 백준
  • string
  • 정렬
  • BFS
  • 구조 분해 할당
  • 스프레드 문법
  • 이진 탐색
  • 다이나믹 프로그래밍
  • Subsets
  • Error Boundary
  • 해시 테이블
  • dfs
  • 이터러블
  • 스택
  • 표준 빌트인 객체
  • map
  • javascript
  • float
  • 렌더링 과정

최근 댓글

최근 글

hELLO · Designed By 정상우.
sandwe
[프로그래머스] 다음 큰 숫자 JavaScript
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.