하루에 한 문제

[프로그래머스 월간 코드 챌린지 시즌2] 2개 이하로 다른 비트 -Java 본문

카테고리 없음

[프로그래머스 월간 코드 챌린지 시즌2] 2개 이하로 다른 비트 -Java

dkwjdi 2021. 5. 19. 00:27

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

 

코딩테스트 연습 - 2개 이하로 다른 비트

 

programmers.co.kr

class Solution {
	    public long[] solution(long[] numbers) {
	        long[] answer = new long[numbers.length];
	        
	        for(int i=0; i<numbers.length; i++) {
	        	long number=numbers[i];
	        	String binary = '0'+Long.toBinaryString(number);

	        	if(number%2==0) {
	        		answer[i]=Long.parseLong(binary.substring(0, binary.length()-1)+"1", 2);
	        		continue;
	        	}
	        	
	        	int zeroIndex=findTargetIndex(binary.length()-1, -1, -1, binary, '0');
	        	binary=binary.substring(0, zeroIndex)+'1'+binary.substring(zeroIndex+1);
	        	int oneIndex=findTargetIndex(zeroIndex+1, binary.length(), 1, binary, '1');
	        	binary=binary.substring(0, oneIndex)+'0'+binary.substring(oneIndex+1);
	        	answer[i]=Long.parseLong(binary, 2);
	        }
	        return answer;
	    }

		private int findTargetIndex(int start, int end, int plus, String binary, char target) {
			while(start!=end) {
				if(binary.charAt(start)==target) return start;
				start+=plus;
			}
			return 0;
		}
	}

 

문제 로직을 살펴보면

 

우선 짝수, 홀수 일때로 나누어 집니다.

 

짝수일 경우에는 

무조건 가장 오른쪽자리 비트를 1로 만들어주면 됩니다.

예를들어

2 : 10

4 : 100

6 : 110

 

처럼 짝수는 무조건 가장 오른쪽 자리가 0 이기 때문에 1로 만들어주면 답입니다.

 

홀수일 경우에는

오른쪽에서 시작해 가장 처음 만나는 0을 1로 바꾸어줍니다. (더 큰수를 만들어 주기 위해)

 

그리고 그 자리에서 다시 오른쪽으로 보면서 가장 처음 만나는 1을 0으로 바꿔줍니다.

(위에서 큰수로 바꿧으니 현재 숫자와 차이가 가장 작은 큰 수를 만들어주기 위해 방금 바꾼 비트인덱스 기준 가장 가까운 오른쪽에 있는 1로 된 비트를 0 으로 바꿔줍니다.)

 

끝~

 

 

Comments