2개 이하로 다른 비트

Seongjin Jo·2023년 8월 1일
0

프로그래머스 LV2

목록 보기
25/28

문제

풀이

import java.util.*;
class Solution {
    
    public ArrayList<Long> solution(long[] numbers) {
        ArrayList<Long> answer = new ArrayList<>();
 
        for(long x : numbers){
            if(x % 2 == 0){
                String binaryString = Long.toString(x,2); // 2진수 변환
                String str = binaryString.replaceFirst("0$", "1");  
                answer.add(Long.parseLong(str, 2));
            }
            else{
                String n = Long.toString(x,2);
                if(!n.contains("0")){
                    String temp = "10" + n.substring(1,n.length());
                    answer.add(Long.parseLong(temp,2));
                }
                // 홀수이면서 1과 0이 포함되어있으면 -> 마지막 0을 1로 바꾸고 그 뒤에 1을 0으로 바꿔주면 된다.
                else{
                    // 1 0 0 1
                    // 1 0 1 0
                    char[] temp = n.toCharArray();
                    int idx = n.lastIndexOf("0");
                    temp[idx] = '1';
                    temp[idx + 1] = '0';
                    
                    long aa = Long.parseLong(String.valueOf(temp), 2);
                    answer.add(aa);
                }
            }
        }
        
        return answer;
    }

}

0$ -> 문자열 끝($)의 0을 의미

  1. 짝수
    짝수인 경우에는 무조건 1의 자리가 0이다. 1의 자리 수를 1로 바꿔주면 문제에 해당되는 수를 찾을 수 있다
    ex) 2 -> 10 -> 11 -> output data : 3
    ex) 4 -> 100 -> 101 ->output data : 5
    ex) 6 -> 110 -> 111 -> output data : 7

  2. 홀수
    홀수인 경우에는 2가지의 경우로 나뉜다. 첫번째로는 0이 포함되지 않는 홀수와 두번째로는 0이 포함되는 홀수의 경우이다.
    첫번째 경우에는 그냥 젤 앞의 1을 0으로 바꿔주고 앞에 1을 붙여주면된다.
    두번째 경우에는 마지막 0을 1로 바꾸고 , 그 뒤에있는 1을 0으로 바꿔주면 된다.
    ex) 5 -> 6
    ex) 3 -> 5
    ex) 7 -> 11
    ex) 9 -> 12

두번째 경우의 홀수인 경우에 바꾸는 부분이 헷갈려서 너무 어려웠다.
그냥 문자열 조절하는게 어려우면 char 단위로 쪼개서 하나하나 씩 수정하는 방식으로 잘 해보자.

[ 알아야 할 것들 ]

replaceFirst("0$","1"); -> 처음 나오는 문자를 "1"로 변경
Long.toString(x,2); -> 2진수 문자 형태로
Long.parseLong(temp,2) -> 2진수를 숫자로

1개의 댓글

comment-user-thumbnail
2023년 8월 1일

좋은 글이네요. 공유해주셔서 감사합니다.

답글 달기