목차
문제 이름 및 링크
다음 큰 숫자
https://school.programmers.co.kr/learn/courses/30/lessons/12911
출제 사이트
프로그래머스
문제유형 및 난이도
문제유형: 기초
난이도: Level2
코드 설명
기존에 생각했던 방식의 코드는 아래와 같습니다.
class Solution {
public int solution(int n) {
String nBinary = Integer.toBinaryString(n);
int oneCount = countOneInBinaryString(nBinary);
while(true) {
n++;
String newNBinary = Integer.toBinaryString(n);
if(oneCount == countOneInBinaryString(nBinary)) return n;
}
}
private int countOneInBinaryString(String str) {
return str.length() - str.replace("1","").length();
}
}
주어진 숫자를 Integer.toBinaryString으로 이진법 형태로 변형한 뒤, 1의 개수를 셉니다.
n보다 큰 숫자 중 주어진 숫자와 1의 개수가 같은 최소값을 찾기 위해 1씩 증가시키며 이진법 형태로 변형한 뒤 1의 개수를 세 같은지 확인합니다.
문제의 풀이에는 문제가 없었으며 정확도 검사는 통과했습니다.
다만 효율성 검사에서 문제가 발생했습니다.
생각해보니 컴퓨터는 값을 이진법 형태로 기억하고 있을 수 밖에 없습니다.
그러면 이진 비트에서 1의 개수를 세는 연산이 존재할거라 생각했습니다.
그 연산의 메서드가 Integer.bitCount() 였습니다.
Integer.bitCount를 사용한 코드는 아래와 같습니다.
class Solution {
public int solution(int n) {
int oneCount = Integer.bitCount(n);
while(true) {
n++;
if(oneCount == Integer.bitCount(n)) return n;
}
}
}
변형된 코드에서 확인할 수 있듯이 이전 코드는 일을 두 번하게 만드는 코드였습니다.
코드의 본질을 까먹지 말고 활용할 수 있도록 성장하면 좋겠다는 생각이 든 문제였습니다.
'알고리즘 > 코딩테스트 준비' 카테고리의 다른 글
| 마지막 두 원소 - 쉬운 문제라도 읽기 편한 코딩을 하자 (0) | 2023.08.21 |
|---|---|
| 공백으로 구분하기2 - 문자열 문제는 쓰는 기능만 쓰게 되는 것 같다. trim과 정규화의 활용성 (0) | 2023.08.17 |
| 카펫 - 수학적으로 풀었다고 생각한 풀이와 진짜 수학적 풀이 (0) | 2023.08.16 |
| 짝지어 제거하기 (0) | 2023.08.14 |
| 코딩테스트 기록을 블로그에 남기려고 합니다. (0) | 2023.08.14 |
