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

Lv2. 2개 이하로 다른 비트

  • -
728x90
반응형

문제 보기 : 2개 이하로 다른 비트

 

프로그래머스

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

programmers.co.kr


문제

  • 정답률 : 55%


작성 코드

def solution(numbers):
    answer = []
    
    for num in numbers:
        # 만약 숫자가 짝수라면 다음 수는 바로 +1
        if num % 2 == 0:
            answer.append(num + 1)
        else:
            # XOR 연산을 이용해 최소 1비트 차이 나는 수 찾기
            smallest_diff = (num ^ (num + 1)) >> 2
            answer.append(num + smallest_diff + 1)
    
    return answer

풀이

처음에는 2진법으로 모든 숫자를 바꿔서 해결하려고 했는데 당 당 히 시간초과 후 방법을 바꾸기로 했다..ㅎㅎ

역시 이런건 규칙이 있기 마련인데 규칙 찾기가 매우매우 힘들었다.
짝수일 경우, 바로 다음 숫자가 답이다.
근데 문제는 홀수일 때라는 것이지.. 방법은 XOR 연산이라는데 사실 나도 이게 여기서 나올줄은 몰랐다.

num ^ (num + 1)   num과 num + 1 간의 비트 차이를 확인하는데, 예를 들어 num = 5일 경우 이렇게 돌아간다.
num : 101
num + 1 : 110
XOR(diff): 011 -> 두 숫자 간 차이가 나는 위치가 비트로 나타난다

>>2를 한 이유는 가장 작은 차이를 가진 비트를 무시하고 그 다음 차이를 찾아야해서다.
그리고 원래 수 num에 차이 smallest_diff, 그리고 그 다음 수를 의미하는 1을 더해 답을 구한다!! 

이 방법은 나도 완벽하게 이해하지는 못했고, MS에서 ^는 파이썬의 **와 동일한 개념으로 쓰여서 더 헷갈리는 것 같다.. 
그치만 파이썬에서 ^는 XOR 연산이라는거.. 별 다섯개..⭐⭐⭐⭐⭐

320x100
728x90

'코딩 테스트 > 프로그래머스' 카테고리의 다른 글

Lv2. 큰 수 만들기  (0) 2024.09.30
Lv1. 햄버거 만들기  (0) 2024.09.30
Lv1. 숫자 짝꿍  (0) 2024.09.28
Lv3. 숫자 게임  (0) 2024.09.26
Lv1. 로또의 최고 순위와 최저 순위  (0) 2024.09.26
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.