반응형
문제주소 :programmers.co.kr/learn/courses/30/lessons/12911
<문제 설명>
더보기
문제 설명
자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다.
- 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다.
- 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다.
- 조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다.
예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다.
자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요.
제한 사항
- n은 1,000,000 이하의 자연수 입니다.
입출력 예
n result78 | 83 |
15 | 23 |
입출력 예 설명
입출력 예#1
문제 예시와 같습니다.
입출력 예#2
15(1111)의 다음 큰 숫자는 23(10111)입니다.
<풀이법>
▒ 한줄 개념: . ▒
- n -> 이진수 변환 (binary)
- binary에 대해 맨 뒤부터 역순으로 탐색하며 1이 나올경우 연속된 1의 갯수 count
- 그 후 가장 먼저 나타는 0의 자리에 1삽입, 맨 뒤부터 남은 갯수만큼 1 삽입
위와 같은 방법으로 풀었는데, 단순히 처음 n보다 큰 자연수들에 대해 탐색해가며 이진수에서 1의 갯수가 같은 경우를 찾으면 되는 아주 간단한 문제였습니다.
<코드(Python)>
def solution(n):
binary = list(bin(n).replace("0b", "0"))
found = False
one_cnt = 0
for i in range(len(binary)-1, -1, -1):
if binary[i] == "1":
found = True
binary[i] = "0"
one_cnt += 1
elif found and binary[i] == "0":
binary[i] = "1"
one_cnt -= 1
while one_cnt > 0:
binary[-one_cnt] = "1"
one_cnt -= 1
break
return int(''.join(binary),2)
더 많은 코드 보기(GitHub) : github.com/dwkim-97/CodingTest
반응형
'Programmers' 카테고리의 다른 글
[프로그래머스] 짝지어 제거하기 / Python (0) | 2021.01.21 |
---|---|
[프로그래머스] 폰켓몬 / Python (0) | 2021.01.21 |
[프로그래머스] 쿼드압축 후 개수 세기 / Python (0) | 2021.01.21 |
[프로그래머스] 이진 변환 반복 / Python (0) | 2021.01.21 |
[프로그래머스] 타겟 넘버 / Python (2) | 2021.01.21 |