hoon's bLog

Java 프로그래머스 2개 이하로 다른 비트 자바 본문

코딩테스트/프로그래머스

Java 프로그래머스 2개 이하로 다른 비트 자바

개발한기발자 2024. 3. 4. 11:27
반응형

 

문제출처 : https://school.programmers.co.kr/learn/courses/30/lessons/77885

 

프로그래머스

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

programmers.co.kr


[문제 설명]

[문제 풀기 전 생각/정리]

  • 이진 문자열을 생성하는 Long.toBinaryString() 메서드를 이용하여 조건문을 통해 연산하는 과정이 필요할 것으로 예상

[나의 풀이]

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

        for(int i=0; i<numbers.length; i++){
            String bStr =  Long.toBinaryString(numbers[i]);
            if(numbers[i]%2==0){
                answer[i] = numbers[i]+1;
            }else{
                int lstIdx =  bStr.lastIndexOf("0");
                int _1stIdx = bStr.indexOf("1",lstIdx);
                if(lstIdx==-1){
                    bStr = Long.toBinaryString(numbers[i]+1);
                    bStr = bStr.substring(0,2) + bStr.substring(2, bStr.length()).replace("0","1");

                }else{
                    bStr = bStr.substring(0, lstIdx) +"1"+ bStr.substring(lstIdx+1, _1stIdx) +"0"+ bStr.substring(_1stIdx+1, bStr.length());
                }
                answer[i] = Long.parseLong(bStr,2);
            }
        }
        return answer;
    }
}
  • line 06 : 주어진 숫자를 이진수로 변환하여 이진 문자열로 생성
  • line 11 : 가장 낮은 0을 1로, 그다음 1인 위치를 찾아서 해당 위치의 1을 0으로, 그다음으로 0인 위치를 1로 바꿈

[다른 사람의 풀이]

설마 이것도 stream으로 풀었으려나?..

class Solution {
    public long[] solution(long[] numbers) {
        long[] answer = numbers.clone();
        for(int i = 0; i< answer.length; i++){
            answer[i]++;
            answer[i] += (answer[i]^numbers[i])>>>2;
        }
        return answer;
    }
}
  • line03 : answer에 clone() 메서드를 사용하여 numbers 배열을 복사하여 초기화
  • line06 : 해당 숫자에 1을 더해 이것은 다음으로 큰 숫자를 만들어 XOR 값을 구한다.(XOR 연산은 두 비트가 서로 다른 경우에만 1을 반환)
    이후 비트 shift 연산을 수행함으로써 XOR 결과를 2비트 오른쪽으로 shift 한 값을 구한다.
  • 이것은 0이 아닌 가장 낮은 비트를 찾아내기 위한 연산으로. 만약 0이 아닌 가장 낮은 비트가 존재한다면, 해당 비트를 1로 만들기 위해 1을 더하게 된다.

[정리]

개인 피셜 난이도 : ★

1개라고는 했지만,

다른 분이 사용하신 shift 연산을 생각하는 로직은

2개 정도 되는 것 같다!

 

분명히 비트 연산이 나오니,

당연히 shift 연산이 생각 났으나,

많이 사용을 하지 않다 보니,

로직이 잘 떠오르지 않았다.

 

역시나...

아직도 갈길이 멀다...

언제나 새로운 정보 공유와 잘못된 정보

판/지적/태클은 환영입니다!

도움이 되셨다면 공감♥️, 댓글 부탁드려요:)

끝.

728x90
반응형