18 Mar 2017
|
알고리즘
프로그래밍
출처
문제
어떤 수 N(1≤N≤1,000,000) 이 주어졌을 때, N의 다음 큰 숫자는 다음과 같습니다.
N의 다음 큰 숫자는 N을 2진수로 바꾸었을 때의 1의 개수와 같은 개수로 이루어진 수입니다.
1번째 조건을 만족하는 숫자들 중 N보다 큰 수 중에서 가장 작은 숫자를 찾아야 합니다.
예를 들어, 78을 2진수로 바꾸면 1001110 이며, 78의 다음 큰 숫자는 83으로 2진수는 1010011 입니다.
N이 주어질 때, N의 다음 큰 숫자를 찾는 nextBigNumber 함수를 완성하세요.
풀이 (python)
def nextBigNumber(n):
num_of_one = str(bin(n)).count('1')
for i in range(n+1,1000001):
if str(bin(i)).count('1') == num_of_one:
return i
#아래 코드는 테스트를 위한 출력 코드입니다.
print(nextBigNumber(78))
풀이과정
- 인자 N을 2진수로 변환
- 1의 갯수를 확인
- 10진수 N < x <= 1,000,000 사이의 숫자를 하나씩 2진수로 바꾸어 1의 갯수가 위의 2와 같다면, x를 리턴한다.
배운점
- bin(), oct(), hex() 내장함수를 통해 정수를 각 2진수, 8진수, 16진수로 바꿀 수 있다.
- str() 내장함수를 통해 인자를 문자열로 변환한다.
- str.count(‘검색어’)를 통해서 해당 검색어의 갯수를 리턴한다.
17 Mar 2017
|
알고리즘
프로그래밍
문제출처
문제
numberOfPrime 메소드는 정수 n을 매개변수로 입력받습니다.
1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하도록 numberOfPrime 메소드를 만들어 보세요.
소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)
10을 입력받았다면, 1부터 10 사이의 소수는 [2,3,5,7] 4개가 존재하므로 4를 반환
5를 입력받았다면, 1부터 5 사이의 소수는 [2,3,5] 3개가 존재하므로 3를 반환
풀이
def numberOfPrime(n):
num_list = list(range(n+1))
prime_list = []
for num in num_list:
check = 0
for i in list(range(1,num+1)):
if num % i == 0:
check += 1
if check == 2:
prime_list.append(num)
return len(prime_list)
# 아래는 테스트로 출력해 보기 위한 코드입니다.
print(numberOfPrime(10))
풀이 과정
- 1부터 n 사이의 숫자를 리스트로 만든다. (list, range 함수)
- 리스트의 각 요소를 돌면서 (반복문) 소수인지 확인한다.
- 어떻게 소수인지 확인하지?
- 소수는 1부터 자신까지의 수로 나누어 나머지가 0인 수가 2개만 존재한다. (range, 반복문)
다른사람 풀이
# 소수인지 판단
def is_prime(n):
return all([(n%j) for j in range(2, int(n**0.5)+1)]) and n>1 # bool 값 리턴
# 소수의 갯수 리턴
def numberOfPrime(n):
return [is_prime(x) for x in range(1, n+1)].count(True)
# return len(list(filter(is_prime, range(1, n+1))))
# 아래는 테스트로 출력해 보기 위한 코드입니다.
print(numberOfPrime(10))
배운점
- all() 내장함수 : all(x)은 반복 가능한(iterable) 자료형 x를 입력 인수로 받으며, 이 x가 모두 참이면 True, 거짓이 하나라도 있으면 False를 리턴한다.
- (※ 반복 가능한 자료형이란 for문으로 그 값을 출력할 수 있는 것을 의미한다. 리스트, 튜플, 문자열, 딕셔너리, 집합 등이 있다.)
- .count(x) : 리스트, 문자열, 튜플 등 iterable 자료형 안의 x 요소의 갯수를 리턴한다.