[프로그래머스 Lv2] 2개 이하로 다른 비트(python)
문제
https://programmers.co.kr/learn/courses/30/lessons/77885
나의 코드 (답안참조)
"""
1. 아이디어
2. 시간복잡도
"""
def convert(num):
# 짝수인 경우 num보다 크며 2개 이하인 비트는 +1한 값이다.
if num % 2 == 0:
return num+1
else: # 홀수인 경우는 일정 규칙에 의거해서 num을 반환해준다.
bin_num = '0' + bin(num)[2:]
idx = bin_num.rfind('0')
bin_num = list(bin_num)
bin_num[idx] = '1'
bin_num[idx+1] = '0'
return int(''.join(bin_num), 2)
def solution(numbers):
answer = [ convert(int(num)) for num in numbers]
# 이것도 리스트 내에서 int() 안해주면 TC 7,8,9에서 에러남 이유는 모름..
return answer
print(solution([2, 7]))
설명
1) 짝수의 경우
만약, 4라면 이진수로 100 입니다. 4보다 크면서 2개 이하로 다른 수를 찾으면 101 입니다.
즉, 가장 뒤에 있는 0을 1로 바꿔주면 됩니다.
2) 홀수의 경우
만약, 7이라면 이진수로 0111 (바꿀때 편의를 위해 앞에 0을 붙입니다)
먼저 짝수의 경우처럼 가장 뒤에서 부터 가까운 0의 인덱스(idx)를 찾아 1로 바꿉니다. 그럼 1111 이 됩니다.
bin_num[idx] = '1'
그런 다음 idx+1 의 인덱스 값을 0으로 바꿉니다. 그럼 1011이 되고 답이 됩니다.
bin_num[idx+1] = '0'
"""
1. 아이디어
2. 시간복잡도
"""
def convert(num):
# 짝수인 경우 num보다 크며 2개 이하인 비트는 +1한 값이다.
if num % 2 == 0:
return num+1
else: # 홀수인 경우는 일정 규칙에 의거해서 num을 반환해준다.
bin_num = '0' + bin(num)[2:]
idx = bin_num.rfind('0')
bin_num = list(bin_num)
bin_num[idx] = '1'
bin_num[idx+1] = '0'
return int(''.join(bin_num), 2)
def solution(numbers):
answer = [ convert(int(num)) for num in numbers]
# 이것도 리스트 내에서 int() 안해주면 TC 7,8,9에서 에러남 이유는 모름..
return answer
print(solution([2, 7]))
1) 짝수의 경우
만약, 4라면 이진수로 100 입니다. 4보다 크면서 2개 이하로 다른 수를 찾으면 101 입니다.
즉, 가장 뒤에 있는 0을 1로 바꿔주면 됩니다.
2) 홀수의 경우
만약, 7이라면 이진수로 0111 (바꿀때 편의를 위해 앞에 0을 붙입니다)
먼저 짝수의 경우처럼 가장 뒤에서 부터 가까운 0의 인덱스(idx)를 찾아 1로 바꿉니다. 그럼 1111 이 됩니다.
bin_num[idx] = '1'
그런 다음 idx+1 의 인덱스 값을 0으로 바꿉니다. 그럼 1011이 되고 답이 됩니다.
bin_num[idx+1] = '0'
이러한 규칙 찾는게 쉬운게 아닌데 어떻게 찾는건지 이해가 안간다..
1시간 동안 삽질 후 1시간 이해했다..
참고자료
Author And Source
이 문제에 관하여([프로그래머스 Lv2] 2개 이하로 다른 비트(python)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@tyjk8997/프로그래머스-Lv2-2개-이하로-다른-비트python저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)