알고리즘

프로그래머스 다음 큰 숫자 (JAVA)

박카스마시며코딩 2022. 6. 16. 22:37

https://programmers.co.kr/learn/courses/30/lessons/12911

 

코딩테스트 연습 - 다음 큰 숫자

자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다. 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다. 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니

programmers.co.kr

 

저는 해당 문제를 문자열을 처리하여 해결하였습니다.

먼저 저는 문제의 조건을 만족하면서 다음 수는 어떻게 구해야할까를 고민하였습니다.

저는 뒤에서부터 찾아가면서 처음 1을 발견하고 나서 0을 발견한 곳을 구하고 이를 1과 자리를 옮겨주고 뒤에있는 1들은 낮은 자리부터 채워나가면 된다는 규칙을 찾았습니다.

저는 뒤에서부터 찾아가면서 처음 1을 발견하고 나서 0을 발견한 곳을 구하고 0부터 뒤의 문자열을 지우고 1을 추가하고 지운 0의 개수만큼 0을 먼저 채우고 나머지는 1을 채웠습니다.

여기서 문제점은 자리수가 달리지는 경우인데 이를 위해 저는 이진수 문자열 맨 앞에 0을 붙여 해결하였습니다.

 

class Solution {
    public int solution(int n) {
        int answer = 0;
        String binearyNum = changeBinearyNumber(n);
        
        String nextBinearyNum = nextNumber(binearyNum);
        
        answer =  changeDeciamlNumber(nextBinearyNum);
        return answer;
    }
    private static final char ONE = '1';
    private static final char ZERO = '0';
    private int changeDeciamlNumber(String s){
        int result = 0;
        int num = 1;
        for(int i = s.length()-1 ; i >= 0  ; i--){
            char now = s.charAt(i);
            if(now == ONE){
                result += num * 1;
            }
            num *= 2;
        }
        return result;
    }
    private String nextNumber(String s){
        StringBuilder sb = new StringBuilder();
        sb.append(ZERO);
        sb.append(s);
        int size = sb.length();
        int index = 0;
        int zeroCnt = 0;
        boolean findOne = false;
        for(int i = size - 1; i >= 0 ; i--){
            char now = sb.charAt(i);
            if(now == ONE && !findOne){
                findOne = true;
                continue;
            }
            if(now == ZERO){
                zeroCnt++;
            }
            if(now == ZERO && findOne){
                index = i;
                break;
            }

        }
        
        int length = sb.length() - index-1;
        sb.delete(index, sb.length());
        sb.append(ONE);
        for(int i = 0 ; i < length ; i++){
            if(zeroCnt > 0){
                zeroCnt--;
                sb.append(0);
            }else{
                sb.append(1);
            }
        }
        return sb.toString();
    }
    private String changeBinearyNumber(int num){
        StringBuilder sb = new StringBuilder();
        while(num > 0){
            if(num % 2 == 0){
                sb.append(0);
            }else{
                sb.append(1);
            }
            num /= 2;
        }
        sb = sb.reverse();
        return sb.toString();
    }
}