[ 코드카타 ] 알고리즘 | 14~20번
🗓️ 기간: 6/2 ~ 6/8 (3주차)
14. 약수의 합 (6/2)
정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
def solution(n):
answer = 0
for i in range(1, n+1):
if n % i == 0 :
answer += i
return answer
# list comprehension
def solution(n):
answer = sum([i for i in range (1, n+1) if n % i == 0])
return answer
n의 약수는 n을 나누었을 때 나머지가 0인 자연수이다. 따라서 n % i == 0 을 조건으로 걸어주면 된다.
15. 나머지가 1이 되는 수 찾기 (6/3)
자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요.
def solution(n):
for x in range(1,n):
if n % x == 1:
return x
조건을 만족하는 순간 즉시 결과를 return하고 함수를 종료하도록 해서 가장 작은 자연수를 반환하도록 한다.
16. x만큼 간격이 있는 n개의 숫자 (6/4)
정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴하는 solution 함수를 완성해주세요.
def solution(x, n):
answer = []
for i in range(1, n+1):
answer.append(x * i)
return answer
# list comprehension
def solution(x, n):
return [x * i for i in range(1, n+1)]
예를 들어 x = 4, n = 3 이면 return 값으로 [4, 8, 12]가 반환된다.
17. 자연수 뒤집어 배열로 만들기 (6/5)
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
def solution(n):
return [int(i) for i in str(n)][::-1]
정수로 변환된 리스트를 [::-1] 를 사용해 역순으로 뒤집을 수 있다.
def solution(n):
num = [int(i) for i in str(n)]
num.reverse()
return num
def solution(n):
return [int(i) for i in reversed(str(n))]
찾아보니 바로 뒤집을 수 있는 함수와 메서드가 있었다.
reverse( ) : 리스트 객체의 메서드로, 리스트를 제자리에서 뒤집는다.
reversed( ) : 반복 가능한 객체를 역순으로 반환하는 함수
18. 문자열을 정수로 바꾸기 (6/6)
문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요. 예를들어 str이 "1234"이면 1234를 반환하고, "-1234"이면 -1234를 반환하면 됩니다.
def solution(s):
answer = int(s)
return answer
정수형으로 바꿀 때 int( )를 사용하면 문자 +, -가 알아서 양,음의 기호로 인식된다.
19. 정수 제곱근 판별 (6/7)
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다. n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
입출력 예 : 121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.
def solution(n):
x = int(n ** 0.5)
if x * x == n:
return (x + 1) ** 2
else:
return -1
n ** 0.5 으로 제곱근을 계산할 수 있다. n의 제곱근이 양의 정수가 아니라면(소수점이 있다면) int로 정수부분만 추출해 다시 제곱을 했을 때 n이 나오지 않을 것이다.
20. 정수 내림차순으로 배치하기 (6/8)
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
def solution(n):
answer = ''
num = [i for i in str(n)]
num.sort(reverse=True)
for j in num:
answer += j
return int(answer)
sort 메서드를 쓰기 위해 n을 리스트로 만들어준 다음, for 문을 이용해 다시 리스트를 문자열로 바꿔주는 방식으로 코드를 작성했다. 다른 사람 풀이를 보니 아래처럼 훨씬 더 간단하게 풀 수도 있었다.
def solution(n):
ls = sorted(str(n), reverse = True)
return int(''.join(ls))
우선 리스트의 sort 메서드 대신에 sorted 함수를 사용하면 입력값이 리스트가 아니더라도 정렬된 결과를 리스트로 반환한다. 그 다음 ''.join( )을 사용해 리스트의 문자열 요소들을 하나로 합칠 수 있다.
💬 확실히 이번 주 코드카타는 초반에 비해 난이도가 올라간 것이 느껴졌다. 그 전까지는 문제를 보고 바로바로 코드를 작성할 수 있었는데, 이제는 조금 더 고민을 해봐야 풀 수 있었다.