Programmers - 다음 큰 숫자
문제 설명
자연수 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 이하의 자연수 입니다.
입출력 예
제출 코드
Python
def solution(n):
OneCount = bin(n).count('1')
while True:
answer += 1
if OneCount == bin(n).count('1'):
return answer
Swift
import Foundation
func solution(_ n: Int) -> Int {
var answer = n
var oneCount = 0
let number = String(n, radix: 2) // 2진수로 변환
for item in number { // 1의 개수 카운팅
if item == "1" {
oneCount += 1
}
}
while true { // 조건에 맞는 정수 구하기
var count = 0
answer += 1
for item in String(answer, radix: 2) {
if item == "1" {
count += 1
}
}
if count == oneCount {
return answer
}
}
문제 풀이
처음에는 문제를 너무 어렵게 생각했다.
주어진 정수값을 2진수로 변경하여 1의 어떻게 조합시켜야 할 지 고민했다. 물론 그렇게도 푸는것은 가능할 것 같지만 생각해야 할 예외사항이 너무 많았다.
보다 효율적인 방법을 생각하던중, 2진수의 값을 만들고 10진수로 변환하는 것이 아니라 10진수의 값을 2진수로 변환하여 비교하는 방법이 훨씬 효율적일 것 이라는 생각이 들었다.
아래 흐름대로 문제를 풀었다.
-
주어진 10진수의 값(n) 을 2진수로 변환하여 1의 개수를 파악한다.
-
while
문을 통해 answer값을 1씩 증가시키며 n보다 크며 2진수 변환시 1의 갯수가 n과 동일한 정수를 찾는다.
배운 점
아직 파이썬 풀이도 부족하지만 스위프트는 정말 너무 부족하다.
Swift
let number = String(n).map({Int(String($0))!}) // 문자 배열을 정수 배열로 변환! map(Int(String($0))!)
'Algorithm & SQL > Programmers' 카테고리의 다른 글
[Algorithm] [Python&Swift] Programmers - 최솟값 만들기 (0) | 2020.06.16 |
---|---|
[Algorithm] [Python/Swift] Programmers - 오픈채팅방 (0) | 2020.06.14 |
[Algorithm] [Python/Swift] Programmers - 카펫 (0) | 2020.06.07 |
[Algorithm] [Python/Swift] Programmes - 최댓값과 최솟값 (0) | 2020.06.07 |
[Algorithm] [Python/Swift] Programmers - 올바른 괄호 (0) | 2020.06.06 |