728x90
반응형
programmers.co.kr/learn/courses/30/lessons/12911?language=python3
최종 풀이
def solution(n):
bin_n = str(bin(n))[2:]
num_n = 0
for i in bin_n:
if i == '1': num_n += 1
for n1 in range(n+1, 1000065):
bin_n1 = str(bin(n1))[2:]
num_n1 = 0
for i in bin_n1:
if i == '1': num_n1 += 1
if num_n1 == num_n:
return n1
풀이 과정
풀이 시간 10분
1. n의 이진수 변환 및 1의 개수 구하기
bin_n = str(bin(n))[2:]
num_n = 0
for i in bin_n:
if i == '1': num_n += 1
먼저, 10진수의 n을 2진수로 변환해야한다.
파이썬에서는 10진수를 2진수로 변환하는 bin()이라는 내장함수가 있다. (아래 참고자료를 참고하자.)
bin(n)을 하면 0b1111이 출력됨을 확인하고 나는 이를 문자열로 변환해 2번째 인덱스부터 bin_n에 넣었다.
그 다음 for문을 통해 bin_n에 1을 num_n에 카운팅 해주었다.
2. 다음 큰 숫자 구하기
for n1 in range(n+1, 1000065):
bin_n1 = str(bin(n1))[2:]
num_n1 = 0
for i in bin_n1:
if i == '1': num_n1 += 1
if num_n1 == num_n:
return n1
이제, 이진수 n의 1의 개수와 같으면서 다음으로 큰 숫자를 구해야한다.
문제의 제한 사항은 n이 1,000,000 이하의 자연수라는 것이다. 그렇다면 n = 1,000,000이면 다음 큰 숫자는 n = 1,000,064인 것을 알 수 있다.
따라서, for문의 범위를 n+1부터 1000065까지로 설정하여 발생되는 n1을 통해 다음 큰 숫자를 찾아준다.
- n1을 n과 같은 방법으로 2진수로 변환해 문자열로 bin_n1에 담아준다.
- bin_n1의 1의 개수를 카운팅하여 num_n1에 담는다.
- num_n1 == num_n이면 n1이 다음 큰 숫자이다.
다른 사람의 풀이
def solution(n):
c = bin(n).count('1')
for m in range(n+1,1000065):
if bin(m).count('1') == c:
return m
내가 푼 방법과 똑같지만 코드가 훨씬 더 간결하다.
먼저, 이진수로 변환하여 1의 개수만 세어주면 되기 때문에 접두어인 0b를 없애기 위한 문자열 슬라이싱을 하지 않았다.
또한, 파이썬 문자열 내장함수인 count()를 활용해서 간단하게 1의 개수를 구했다. (이 문제에서 사용된 내장함수들은 아래 참고자료를 확인하자.)
이렇게 내장함수를 적절하게 활용하여 코드를 작성하는 것이 훨씬 더 효율적인 것 같다.
참고
728x90
반응형
'코테 노트 > 프로그래머스' 카테고리의 다른 글
Level 2 점프와 순간 이동 Python3 (0) | 2021.01.29 |
---|---|
Level 2 영어 끝말잇기 Python3 (0) | 2021.01.29 |
Level 2 소수만들기 Python 3 (0) | 2021.01.21 |
Level 2 올바른 괄호 Python (0) | 2021.01.15 |
Level 2 짝지어 제거하기 (0) | 2021.01.14 |