한 걸음씩
[프로그래머스][JS] 다음 큰 숫자 본문
https://school.programmers.co.kr/learn/courses/30/lessons/12911
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이 과정
function solution(n) {
const nBinary = n.toString(2)
const nCnt = [...nBinary].filter(item => item === '1').length
// n보다 큰 자연수 & 2진수로 변환시 n의 갯수가 같을 것
for (let i = n + 1; i <= 1000000; i++){
const findNum = i.toString(2)
const findCnt = [...findNum].filter(item => item === '1').length
if (findCnt === nCnt){
return i
}
}
}
문제를 풀기 위한 조건 3가지가 있다.
1. n 보다 큰 수
2. n 보다 큰 수의 이진수의 1의 개수와 n의 이진수의 1의 개수가 같을 것
3. n 보다 큰 수는 만족하는 수들 중 가장 작은 수 일 것
위의 조건을 만족할 수 있도록 toString메서드와 filter, length 메서드를 사용했다.
toString메서드는 해당 수를 이진수로 변환할 때 사용하고
filter는 이진수에서 1만 찾아서 length 메서드로 개수를 세는 방식을 사용했다.
n 보다 큰 수를 찾기 위해서 n + 1 이상 1000000 이하까지 범위를 잡았다. 1000000은 제한 사항에 제시한 수 범위이다.
반복을 하면서 나오는 수들을 이진수로 변환하고 필터링해서 1의 개수를 세는 방식을 사용했는데
반복문 마지막에 n과 n보다 큰 수의 1의 개수가 같은 경우 반환하고 종료할 수 있도록 로직을 작성했다.
리뷰
최근에 풀어본 문제 중에서 시간도 안들이고 쉽게 푼 것 같다.
'Programmers' 카테고리의 다른 글
[프로그래머스][JS] 크기가 작은 부분문자열 (0) | 2023.06.30 |
---|---|
[프로그래머스][JS] 피보나치 수 (0) | 2023.06.30 |
[프로그래머스][JS] 이진 변환 반복하기 (0) | 2023.06.29 |
[프로그래머스][JS] 올바른 괄호 (0) | 2023.06.29 |
[프로그래머스][JS] JadenCase 문자열 만들기 ✅ (0) | 2023.06.29 |