31번. 수박수박수박수박수박수?
길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.
def solution(n):
answer = ''
for num in range(1, n + 1):
answer += '수' if num % 2 != 0 else '박'
return answer
길이가 홀수이면 '수', 짝수이면 '박'을 순서대로 더하는 것을 아이디어로, 어쩔 수 없이 for와 if를 사용했다. for와 if 없이도 작성할 수 있을까해서 다른 사람들의 풀이를 봤는데,
def water_melon(n):
str = "수박"*n
return str[:n]
또 한번 이마 탁!
사실 문제를 보자마자 든 생각은 '슬라이싱'이었다. 하지만, 슬라이싱을 할 정도의 길이의 문자열을 어떻게 설정해야할 지 감이 안잡혀 조건문으로 눈을 돌린 건데 위의 코드는 주어진 n이라는 자연수만큼 '수박'을 곱함으로 해결했다.
32번. 내적
길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.
이때, a와 b의 내적은 a[0]b[0] + a[1]b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)
def solution(a, b):
return sum(a_num * b_num for a_num, b_num in zip(a, b))
배열의 각각의 요소들을 연산하기 위해서 어제 배웠던 zip을 응용하여 작성하였다.
33번. 약수의 개수와 덧셈
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
def solution(left, right):
answer = sum(range(left, right + 1))
for n in range(left, right + 1):
if n == 1 or int(n**0.5) == n**0.5:
answer -= n * 2
return answer
n 이라는 정수가 어떤 수의 제곱이면 약수의 개수가 홀수라는 아이디어를 생각해냈다. (드디어!!)
따라서 주어진 left와 right라는 수를 다 더하고, 약수의 개수가 홀수인 제곱수를 총 합에서 빼준다.(두 번 빼야 함. 이미 위에서 한번 더했기 때문에)
반복문을 덜 사용하기 때문에 성능이 좋다.
하지만 리스트 컴프리헨션을 사용하면 더 짧고 직관적으로 작성할 수 있다.
사실 이 방법도 생각안한 것은 아니지만 sum()이 바로 가능하다는 부분을 몰라서 시도를 하지 않았다.
def solution(left, right):
return sum(n if (n ** 0.5) % 1 else -n for n in range(left, right + 1))
# 리스트 컴프리헨션이기 때문에, sum([-13, -14, -15, 16, -17]) == -43