상세 컨텐츠

본문 제목

2개 이하로 다른 비트 (월간 코드 챌린지 시즌2)

프로그래머스 코딩테스트 풀이

by 발발개발 2022. 7. 15. 15:00

본문

원본 : https://school.programmers.co.kr/learn/courses/30/lessons/77885

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

import java.util.*;

class Solution {
    public long[] solution(long[] numbers) {
        long[] answer = new long[numbers.length];
        int idx = 0;

        for (long num : numbers) {
            if (num < 3) {
                answer[idx++] = num + 1;
            } else {

                String num2 = get10to2(num);

                StringBuilder right = new StringBuilder(num2.substring(num2.indexOf("1") + 1));
                String result;

                if (right.indexOf("0") >= 0) {
                    int lastZeroIndex = right.lastIndexOf("0");

                    right.deleteCharAt(lastZeroIndex);
                    right.insert(lastZeroIndex, "1");

                    if (lastZeroIndex != right.length() - 1) {
                        right.deleteCharAt(lastZeroIndex + 1);
                        right.insert(lastZeroIndex + 1, "0");
                    }

                    result = right.insert(0, "1").toString();

                } else {
                    result = right.insert(0, "10").toString();
                }

                answer[idx++] = get2to10(result);
            }
        }

        return answer;
    }

    public String get10to2(long num) {
        StringBuilder sb = new StringBuilder();

        while (num > 0) {
            sb.append(num % 2);
            num /= 2;
        }

        return sb.reverse().insert(0, 0).toString();
    }

    public long get2to10(String str) {
        long[] arr = Arrays.stream(str.split("")).mapToLong(Long::parseLong).toArray();
        long result = 0;

        for (int i = arr.length - 1; i >= 0; i--) {
            result += arr[i] * Math.pow(2, arr.length - 1 - i);
        }

        return result;
    }
}

관련글 더보기

댓글 영역