[파이썬] AI 알고리즘 문제 : 기초 04
1. 세균증식
어떤 세균은 1시간에 두 배만큼 증식한다고 합니다. 처음 세균의 마릿수 n과 경과한 시간 t가 매개변수로 주어질 때 t시간 후 세균의 수를 return 하도록 solution 함수를 완성해 주세요.
def solution(n, t):
return n * (2 ** t)
# 테스트
print(solution(1, 1)) # 1시간 후 세균의 수: 1 * (2 ** 1) = 2
print(solution(2, 3)) # 3시간 후 세균의 수: 2 * (2 ** 3) = 16
제공된 문제에서는 세균이 1시간에 두 배만큼 증식한다고 했으므로, 매 시간마다 현재 세균의 수에 2를 곱해주어야 합니다.
제곱 연산자인 **는 Python에서 지수 계산을 수행합니다. 2 ** t는 2를 t번 곱한 값을 의미합니다. 따라서 이것을 적용하여 문제를 해결하기 위해 n * (2 ** t)와 같은 표현을 사용합니다. 이것은 세균의 처음 수 n에 시간 t를 2번 곱한 값이 됩니다.
예를 들어, 처음 세균의 수가 1이고, 3시간이 지난 후의 세균의 수를 구한다고 가정해 봅시다.
처음에는 세균의 수가 1입니다. 1시간 후에는 1 * 2 = 2 마리가 됩니다. 2시간 후에는 2 * 2 = 4 마리가 됩니다. 3시간 후에는 4 * 2 = 8 마리가 됩니다.
따라서 3시간이 지난 후 세균의 수는 8이 됩니다. 이것을 계산하는 식으로 나타내면 다음과 같습니다:
세균의 수 = 처음 세균의 수 * (2 ** 시간)
2. 삼각형의 완성 조건
선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.
- 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.
삼각형의 세 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다.
세 변으로 삼각형을 만들 수 있다면 1, 만들 수 없다면 2를 return 하도록 solution 함수를 완성해 주세요.
def solution(sides):
return 1 if max(sides) < (sum(sides) - max(sides)) else 2
def solution(sides):
sides.sort()
return 1 if sides[0]+sides[1]>sides[2] else 2
입출력 예 설명
입출력 예 #1
- 가장 큰 변인 3이 나머지 두 변의 합 3과 같으므로 삼각형을 완성할 수 없습니다. 따라서 2를 return 합니다.
입출력 예 #2
- 가장 큰 변인 6이 나머지 두 변의 합 5보다 크므로 삼각형을 완성할 수 없습니다. 따라서 2를 return 합니다.
입출력 예 #3
- 가장 큰 변인 222가 나머지 두 변의 합 271보다 작으므로 삼각형을 완성할 수 있습니다. 따라서 1을 return 합니다.
3. 중앙값 구하기 (크기가 가운데로 큰 값)
중앙값은 어떤 주어진 값들을 크기의 순서대로 정렬했을 때 가장 중앙에 위치하는 값을 의미합니다. 예를 들어 1, 2, 7, 10, 11의 중앙값은 7입니다. 정수 배열 array가 매개변수로 주어질 때, 중앙값을 return 하도록 solution 함수를 완성해 보세요.
def solution(array):
return sorted(array)[len(array) // 2]
주어진 코드는 **solution**이라는 함수를 정의하고 있습니다.
이 함수는 리스트 **array**를 매개변수로 받아 해당 리스트를 Sorted로 작은 수부터 큰 수까지 크기별 정렬한 후에 중앙값을 반환합니다.
중앙값은 정렬된 리스트에서 중앙에 위치한 값입니다.
예를 들어, 리스트 **[2, 1, 5, 3, 4]**가 주어졌을 때, 이 리스트를 정렬하면 **[1, 2, 3, 4, 5]**가 되고, 중앙값은 3이 됩니다.
따라서 주어진 코드는 정렬된 리스트에서 중앙값을 반환하는 간단한 함수를 구현하고 있습니다.
def solution(array):
return sorted(array)[len(array) // 2]
# 함수 호출 및 테스트
arr1 = [1, 2, 3, 4, 5]
print(solution(arr1)) # 출력: 3
arr2 = [5, 4, 3, 2, 1]
print(solution(arr2)) # 출력: 3
arr3 = [3, 1, 4, 2]
print(solution(arr3)) # 출력: 2
4. 짝수는 싫어요
정수 n이 매개변수로 주어질 때, n 이하의 홀수가 오름차순으로 담긴 배열을 return 하도록 solution 함수를 완성해 주세요.
def solution(n):
return [x for x in range(n + 1) if x % 2]
def solution(n):
return [i for i in range(1, n+1) if i % 2 != 0]
- range(1, n+1)을 사용하여 1부터 **n**까지의 정수 범위를 생성합니다.
- 리스트 컴프리헨션을 사용하여 이 범위에 대해 반복하면서 홀수인 수만 선택하여 배열을 생성합니다.
- i % 2!= 0을 사용하여 홀수를 필터링합니다. 필터링된 홀수들을 새로운 리스트에 담아 반환합니다.
예를 들어, **n**이 10일 경우 함수는 **[1, 3, 5, 7, 9]**를 반환합니다.
i % 2는 i를 2로 나눈 나머지를 계산합니다. 그리고 이 값이 0이 아니라면 i는 홀수입니다.
- 예를 들어, 5를 2로 나눈 나머지는 1이므로 5는 홀수입니다. 따라서 5 % 2는 1이 되고, 이는 0이 아니므로 5는 홀수입니다.
이것을 코드로 표현하면 5 % 2 != 0이 되며 이는 참(True)이 됩니다.
- 그러나 4를 2로 나눈 나머지는 0이므로 4는 홀수가 아닙니다. 따라서 4 % 2는 0이 되고, 이는 0과 같으므로 4는 홀수가 아닙니다. 이를 코드로 표현하면 4 % 2 != 0이 되며 이는 거짓(False)이 됩니다.
5. 순서쌍의 개수
순서쌍이란 두 개의 숫자를 순서를 정하여 짝지어 나타낸 쌍으로 (a, b)로 표기합니다. 자연수 n이 매개변수로 주어질 때 두 숫자의 곱이 n인 자연수 순서쌍의 개수를 return 하도록 solution 함수를 완성해 주세요.
- 예를 들어, n이 6일 경우, (1, 6), (2, 3), (3, 2), (6, 1) 네 개의 순서쌍이 있으므로 함수는 4를 반환합니다.
def solution(n):
return len(list(filter(lambda v: n % (v+1) == 0, range(n))))
def solution(n):
return len([number for number in range(1, n+1) if n%number == 0])
def solution(n):
answer =0
for i in range(n):
if n % (i+1) ==0:
answer +=1
return answer
def solution(n):
count = 0 # 자연수 순서쌍의 개수를 세기 위한 변수 초기화
# 1부터 n까지의 숫자를 순회합니다.
for i in range(1, n + 1):
# i가 n의 약수인 경우
if n % i == 0:
count += 1 # 약수인 경우 count를 1 증가시킴
# 자연수 순서쌍의 개수를 반환
return count
count = 0 # 자연수 순서쌍의 개수를 세기 위한 변수 초기화
**count**라는 변수를 선언하고 0으로 초기화합니다. 이 변수는 자연수 순서쌍의 개수를 세는 데 사용됩니다.
for i in range(1, n+1):
for j in range(1, n+1):
for 반복문을 사용하여 **i**와 **j**라는 변수를 사용하여 1부터 **n**까지의 숫자 범위를 반복합니다.
이중 반복문을 사용하여 모든 가능한 순서쌍을 생성합니다.
if i * j == n:
if 조건문을 사용하여 현재 순서쌍 **(i, j)**의 곱이 주어진 자연수 **n**과 같은지를 확인합니다.
count += 1 # 두 숫자의 곱이 n이면 count를 1 증가시킵니다.
만약 두 숫자의 곱이 **n**과 같다면 count 변수를 1 증가시킵니다. 이는 자연수 순서쌍의 개수를 세는 데 사용됩니다.
return count # 자연수 순서쌍의 개수를 반환합니다.
마지막으로 함수는 자연수 순서쌍의 개수인 count 변수를 반환합니다.
6. 모음제거 (특정 알파벳 Remove 한 문장 결괏값 출력)
주어진 문자열을 순회하면서 각 문자가 모음인지 검사하고, 모음이 아닌 경우 결과 문자열에 추가합니다. 마지막으로 모음이 제거된 문자열을 반환합니다.
def remove_vowels(my_string):
vowels = "aeiouAEIOU" # 모음을 저장한 문자열
result = "" # 모음이 제거된 문자열을 저장할 변수
# 주어진 문자열을 순회하면서
for char in my_string:
# 현재 문자가 모음이 아니면 결과에 추가합니다.
if char not in vowels:
result += char
return result
# 예시 문자열
my_string = "Hello World"
# 모음을 제거한 문자열을 출력합니다.
print(remove_vowels(my_string))
add: 위에처럼 if 절을 이용해 "모음이면 빼고 나머지를 넣은 문자를 더해 출력"하는 새로운 result를 만들어 낼수도 있고,
delete: 혹은 모음을 빈칸으로 replace 해서 my_string이라는 문장을 그대로 출력할수도 있다.
def solution(my_string):
vowels = 'a,e,i,o,u,A,E,I,O,U'
for vowel in vowels:
my_string = my_string.replace(vowel, '')
return my_string
7. 문자 반복 출력
문자열 my_string과 정수 n이 매개변수로 주어질 때, my_string에 들어있는 각 문자를 n만큼 반복한 문자열을 return 하도록 solution 함수를 완성해 보세요.
예시 aaabbbccc를 얻고 싶을 때 사용하는 코드
def solution(my_string, n):
repeated_string = "" # 반복된 문자열을 저장할 변수 초기화
# 문자열 my_string의 각 문자를 n번 반복하여 repeated_string에 추가합니다.
for char in my_string:
repeated_string += char * n
return repeated_string # 반복된 문자열을 반환합니다.
- repeated_string() 은 함수 호출을 의미합니다. 함수의 이름은 repeated_string이며, 괄호 안에는 함수에 전달되는 매개변수가 들어갑니다. 예를 들어, repeated_string(3)은 repeated_string 함수에 3을 인자로 전달하여 호출하는 것을 의미합니다.
- repeated_string = ""은 변수 선언과 초기화를 의미합니다. 여기서는 repeated_string이라는 문자열 변수를 선언하고 빈 문자열로 초기화하는 것을 의미합니다. 이 변수는 문자열을 저장하는 데 사용됩니다.
만약 반대로 abcabcabc를 얻고 싶다고 한다면
def solution(my_string, n):
repeated_string = my_string * n # 문자열을 n번 반복하여 새로운 문자열을 생성합니다.
return repeated_string
def solution(my_string, n):
repeated_string = "" # 반복된 문자열을 저장할 변수 초기화
for _ in range(n):
repeated_string += my_string # my_string을 n번 추가합니다.
return repeated_string # 반복된 문자열을 반환합니다.
8. 옷가게 할인받기
머쓱이네 옷가게는 10만 원 이상 사면 5%, 30만 원 이상 사면 10%, 50만 원 이상 사면 20%를 할인해줍니다.
구매한 옷의 가격 price가 주어질 때, 지불해야 할 금액을 return 하도록 solution 함수를 완성해보세요.
def solution(price):
# 할인율을 초기화합니다.
discount_rate = 0
# 가격에 따라 할인율을 설정합니다.
if price >= 500000:
discount_rate = 0.20 # 50만 원 이상인 경우 20% 할인
elif price >= 300000:
discount_rate = 0.10 # 30만 원 이상인 경우 10% 할인
elif price >= 100000:
discount_rate = 0.05 # 10만 원 이상인 경우 5% 할인
# 할인된 가격을 계산합니다.
discounted_price = price * (1 - discount_rate)
# 소수점 이하를 버린 정수로 계산된 총 지불 금액을 반환합니다.
return int(discounted_price)
# 할인율을 초기화합니다. discount_rate = 0
- 할인율을 초기화하는 것은 변수를 명시적으로 설정하는 좋은 프로그래밍 습관입니다. 코드를 작성할 때 변수를 초기화하면 해당 변수가 사용되기 전에 항상 값이 지정되어 있음을 보장할 수 있습니다.
- 할인율을 초기화하는 이유는 코드를 명확하고 읽기 쉽게 만들기 위해서입니다. 할인율을 초기화하면 코드를 이해하기 쉬워지고 코드의 가독성이 향상됩니다. 또한 변수를 초기화함으로써 프로그램의 다른 부분에서 해당 변수를 사용하기 전에 항상 값을 갖게 됩니다.
- 할인율을 초기화하는 이유는 코드의 가독성과 안정성을 높이기 위해서입니다. 할인율을 미리 초기화하면 코드의 다른 부분에서 해당 변수를 사용하기 전에 항상 값이 지정되어 있음을 보장할 수 있습니다.
# 소수점 이하를 버린 정수로 계산된 총 지불 금액을 반환합니다.
- return int(discounted_price)
아니면 이렇게 할 수 있다.
def solution(price):
discount_rates = {500000: 0.8, 300000: 0.9, 100000: 0.95, 0: 1}
for discount_price, discount_rate in discount_rates.items():
if price >= discount_price:
return int(price * discount_rate)
def solution(price):
if price>=500000:
price = price *0.8
elif price>=300000:
price = price *0.9
elif price>=100000:
price = price * 0.95
return int(price)
9. 제곱수 판별하기
어떤 자연수를 제곱했을 때 나오는 정수를 제곱수라고 합니다. 정수 n이 매개변수로 주어질 때, n이 제곱수라면 1을 아니라면 2를 return하도록 solution 함수를 완성해주세요.
- n의 제곱근을 구합니다.
- 제곱근이 정수인지 확인합니다.
- 제곱근이 정수라면 n은 제곱수이고, 아니라면 제곱수가 아닙니다.
def solution(n):
return 1 if (n ** 0.5).is_integer() else 2
Python에서 ** 연산자는 거듭제곱을 계산하는 연산자이며, 여기서는 n ** 0.5를 통해 n의 제곱근을 구합니다.
그리고 .is_integer() 메서드를 사용하여 해당 제곱근이 정수인지를 확인합니다.
예를 들어, 주어진 정수가 16이라면, 이것의 제곱근은 4입니다. 따라서 (16 ** 0.5)는 4를 반환하며, 이때 4는 정수이므로 .is_integer() 메서드를 호출하면 True가 반환됩니다. 하지만 만약 주어진 정수가 17이라면, 이것의 제곱근은 약 4.123입니다. 이때 (17 ** 0.5)는 약 4.123을 반환하게 되고, 4.123은 정수가 아니므로 .is_integer() 메서드를 호출하면 False가 반환됩니다.
def solution(n):
if n**(1/2) == int(n**(1/2)) :
return 1
else :
return 2
10. 숨어있는 숫자의 덧셈 (1)
문자열 my_string이 매개변수로 주어집니다. my_string안의 모든 자연수들의 합을 return하도록 solution 함수를 완성해주세요.
def solution(my_string):
return sum(int(i) for i in my_string if i.isdigit())
def solution(my_string):
answer = 0
number = ['0','1','2','3','4','5','6','7','8','9']
for i in range(len(my_string)):
if my_string[i] in number:
answer += int(my_string[i])
else:
continue
return answer
def solution(s):
total_sum = 0
for char in s:
if char.isdigit():
total_sum += int(char)
return total_sum
# 테스트
print(solution("aAb1B2cC34oOp")) # 출력: 10
print(solution("1a2b3c4d123")) # 출력: 16