해당 문제는 toString 메서드로 인한 각 숫자마다의 2진수 변환을 이용했는데요. 2진수로 변환 된 문자열에서 1의 개수가 몇개인지를 파악 해주는 함수를 하나 만들어 활용했습니다.
사실 원래는 2진수 구하는 식을 사용해 하나 하나 다 계산했는데요. 근데 toString의 쓰임새를 검색해 보다가 진법 변환이 가능하다는걸 알게 되어 깔끔하게 방식을 선회했습니다 ㅎ...
아무튼 공식을 적용한 자바스크립트 버전을 소개해 드리겠습니다.
- 자바스크립트 버전
// 전달 받은 2진법 문자열 중에 1이 몇개인지를 도출해주는 함수 function calcOneCount(binary){ let count = 0; for(let i = 0; i < binary.length ; i++){ if(binary[i] === '1') count++; } // count의 개수는 곧 1의 개수 return count; } // 실행할 메인 solution 함수 function solution(n) { // 매개변수 n을 2진수로 변환하여 calcOneCount에 전달하고, 반환 받은 개수를 inputNumberCount에 전달 let inputNumberCount = calcOneCount(n.toString(2)); // 비교할 숫자값을 담을 변수 선언 let compareNumber; // n의 2진수의 1의 개수와 특정 수의 2진수의 1의 개수가 같을 때까지 반복할 while문 while(true){ // n(숫자)를 현재에서 1증가 n++; // compareNumber에 증가한 n 대입 compareNumber = n // n 다음 값에 대해서도 1의 개수를 구하는 함수를 돌려줌 let compareNumberCount = calcOneCount(n.toString(2)); // 만약 n과 그 다음 수의 2진수에 대한 1의 개수가 같으면 break; if(compareNumberCount == inputNumberCount) break; } // while문에서 조건에 맞을 때 저장되어있던 compareNumber를 반환 return compareNumber; };
그리고 자바 버전으로 구현한 코드는 다음과 같습니다.
- 자바 버전
public class Solution { public int calcOneCount(String binary) { int count = 0; for (int i = 0; i < binary.length(); i++) { // 자바에서는 문자열의 특정 인덱스의 문자를 가져올 수 있는 charAt 메서드도 존재하니, 인덱스 접근([i])을 사용하든 해당 메서드를 사용하든 무관합니다. if (binary.charAt(i) == '1') { count++; } } return count; } public int solution(int n) { int inputNumberCount = calcOneCount(Integer.toBinaryString(n)); int compareNumber; while (true) { n++; compareNumber = n; int compareNumberCount = // 자바에서는 toString이 아니라 Integer 클래스의 toBinaryString, toOctalString ,toHexString 등의 메서드를 사용해야 합니다.다.calcOneCount(Integer.toBinaryString(compareNumber)); if (compareNumberCount == inputNumberCount) break; } return compareNumber; } }
JS
에서 문자열의 특정 인덱스에 접근하려면 별 어려움 없이 배열로 접근하면 되나, 자바에서는 배열로 접근하는 방법과 charAt
메서드로 접근하는 방법이 존재하는데, 아직까지는 그 차이점을 모르겠으나 그래도 알아두면 좋겠다고 생각되었습니다.
JS
에서는 toString
메서드 하나로 다양한 진법 변환이 가능했는데, 자바에서는 Integer 래퍼 클래스
의 진법 메서드들인 toBinaryString
, toOctalString
, toHexString
를 이용하여 진법을 변환할 수 있었습니다.