코테 노트/프로그래머스

Level 2 2개 이하로 다른 비트 Python 3

화요밍 2022. 3. 9. 23:45
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/77885?language=python3# 

 

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

 

programmers.co.kr

 

최종 코드

 

GitHub - hwayeon351/Programmers-Algorithms: 프로그래머스 알고리즘 소스 코드 모음

프로그래머스 알고리즘 소스 코드 모음. Contribute to hwayeon351/Programmers-Algorithms development by creating an account on GitHub.

github.com

def solution(numbers):
    answer = []
    for num in numbers:
        num = int(num)
        new_num = bin(num+1)[2:]
        bin_num = bin(num)[2:].zfill(len(new_num))
        cnt = 0

        for i in range(len(bin_num)):
            if bin_num[i] == new_num[i]: continue
            cnt += 1
            if cnt > 2: break
        else:
            answer.append(int(new_num, 2))
            continue
        new_num = new_num[:i] + bin_num[i:]
        answer.append(int(new_num, 2))

    return answer

풀이 과정

풀이 시간 35분

예제 테스트에 통과해서 채점을 해보니 이상하게도 7, 8, 9번이 런타임 에러가 났다.

테스트케이스에 최소, 최댓값을 넣어봤는데도 정답이 잘 나와서 왜 런타임 에러가 나는지 감이 오질 않았다.

질문하기를 참고해보니 입력값을 받아올 때도 한 번 더 int형으로 치환해야 한다고 해서 적용해보니 통과할 수 있었다.

그렇지만 이미 입력값이 0에서 10^15 사이의 정수라고 되어 있어서 왜인지는 여전히 잘 모르겠다,,

def solution(numbers):
    answer = []
    for num in numbers:
        num = int(num)
        
        #입력값 num보다 1 더 큰 수를 2진수로 바꾼 값
        new_num = bin(num+1)[2:]
        #입력값 num을 2진수로 바꾼 값
        bin_num = bin(num)[2:].zfill(len(new_num))
        
        #서로 다른 비트의 수 카운팅
        cnt = 0

		#new_num과 bin_num의 비트 비교하기
        for i in range(len(bin_num)):
            if bin_num[i] == new_num[i]: continue
            
            #i번째 비트가 다른 경우, cnt 카운팅
            cnt += 1
            #cnt가 2개보다 많은 경우, 반복문 탈출
            if cnt > 2: break
            
        #new_num과 bin_num의 다른 비트가 2개 이하인 경우,
        else:
        	#new_num을 10진수로 바꾸고 answer에 추가한다
            answer.append(int(new_num, 2))
            continue
            
        #new_num과 bin_num의 다른 비트가 2개 초과인 경우,
        #3번쨰로 다른 i번 비트부터 bin_num의 비트로 바꾼다
        new_num = new_num[:i] + bin_num[i:]
        
        #new_num을 10진수로 바꾸고 answer에 추가한다
        answer.append(int(new_num, 2))

    return answer
    
#시간복잡도 = O(n^2), 공간복잡도 = O(n)

 

728x90
반응형