안녕하세요~오늘은 프로그래머스 알고리즘 연습 4일차입니다(~시간상 4일은 아닌....~~)
전 요새 회사에서 거의 자바스크립트만 만지고 있어서 알고리즘 연습을 스크립트만 하고 있는데
다른 언어도 다음에 천천히 해볼께요~ 이전까지는 프로그래머스에서 Level 1만 풀었는데 오늘은 Level 2를 풀어볼께요 그렇다고 확 어려워지진 않습니다~
오늘 풀어볼 문제 제목은 다음 큰 숫자..?? 이건 또 뭐지..일단 문제 갑니다~
문제 | 자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다. 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다. 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다. 조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다. 예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다. 자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요. |
---|---|
제한 사항 | n은 1,000,000 이하의 자연수 입니다. |
입출력 예 | |
---|---|
n | return |
78 | 83 |
15 | 23 |
- 입출력 예시 15(1111)의 다음 큰 숫자는 23(10111)입니다.
개발 하시는 분들은 아시다시피 개발하려면 일단 내용을 잘 읽어봐야겠죠?
조건 1을 만족하기 위해 출력값에 입력값n을 넣고 1씩 증가 시킬겁니다~그럼 출력할 값은 n보다 큰 자연수겠죠?
조건 2를 만족하기 위해 n의 2진법 변환 1의 개수와 출력값의 2진법 변환 1의 개수를 비교 해서 1의 개수가 동일할때 해당 값을 출력할겁니다.. 말로 하니 뭔소리가 싶으시죠??
(개발자는 코딩으로 말해랏!!)
바로 풀이 들어갈께요
function solution(n) {
var answer = n;
var nOneCnt = n.toString(2).match(/1/g).length;
var mOneCnt = 0;
while(nOneCnt != mOneCnt){
answer += 1;
mOneCnt = answer.toString(2).match(/1/g).length;
}
return answer;
}
위의 말씀 드린것 처럼 조건 1를 만족하기 위해 answer = n 를 처리하고 while 반복문 안에 answer += 1 처리를 했습니다
그리고 조건 2를 만족하기 위해 n의 2진법 변환시 1의 개수를 구해오기 위해n.toString(2).match(/1/g).length 로 처리했습니다. n.toString(2) 을 하면 해당 n의 2진법으로 변환이 되고요.
ex) 15.toString(2) = 1111
거기서 .match(/1/g) 를 하면 2진법으로 변환한 값에 1과 대응되는 문자열을 찾아서 배열로 가져옵니다.
ex) 15.toString(2) .match(/1/g) = [ '1', '1', '1', '1' ]
그후 배열의 length로 1의 개수를 가져왔습니다
아직 포스팅이 부족해서 설명이 부족하지만 다음엔 더 이해 쉽도록 좋은 포스팅으로 돌아오겠습니다~ 그럼 끝나가는 일요일 남은 밤..좋은 밤 되세요~