개발일기 [Python 파이썬]

[파이썬] AI 알고리즘 문제 : 기초 함수 03

neullo 2024. 3. 6. 10:33

 

오늘은 나눈값과 나머지 구하기 함수를 이용해 다양한 문제를 풀어볼 것이다.

 

1) 나눈 값 구하기 함수 [10//5=2]

def solution(num1, num2):
    return num1 // num2
    # 예 # num1이 10, num2가 5이므로 10을 5로 나눈 몫 2를 return 합니다.

 

2) 나머지 구하기 함수 [3%2=1]

def solution(num1, num2):
    return num1 % num2
    # 예 #num1이 3, num2가 2이므로 3을 2로 나눈 나머지 1을 return 합니다.

 

 


특정문자 제거하기

문자열 my_string과 문자 letter이 매개변수로 주어집니다. my_string에서 letter를 제거한 문자열을 return하도록 solution 함수를 완성해주세요.

 

 
def solution(my_string, letter):
    return my_string.replace(letter, "")
 
 
 
my_string에서 문자 letter를 제거한 문자열을 반환하기 위해 replace() 메서드를 사용했습니다. replace() 메서드는 문자열에서 특정 문자나 문자열을 다른 문자열로 대체하는 데 사용됩니다. 여기서는 letter를 빈 문자열("")로 대체하여 해당 문자를 제거했습니다.

replace(letter, " ") 첫 번째를, 두 번째로 바꾸어라
***replace()
메서드는 첫 번째 매개변수로 전달된 문자열을 두 번째 매개변수로 전달된 문자열로 대체합니다. 따라서 my_string.replace(letter, "")my_string에서 letter와 일치하는 부분을 빈 문자열("")로 대체하여 제거하는 것입니다.

몇잔 사고 얼마가 남을까? [나누기, 나머지값 구하기]

머쓱이는 추운 날에도 아이스 아메리카노만 마십니다. 아이스 아메리카노는 한잔에 5,500원입니다. 머쓱이가 가지고 있는 돈 money가 매개변수로 주어질 때, 머쓱이가 최대로 마실 수 있는 아메리카노의 잔 수와 남는 돈을 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
 
우선 나누기 해서 나눈 값을 구하고, 딱 맞아 떨어지지 않을 경우 나머지도 구해야한다.
 

나눈 값 구하기 함수 [10//5=2]

def solution(num1, num2):
    return num1 // num2
    # 예 # num1이 10, num2가 5이므로 10을 5로 나눈 몫 2를 return 합니다.

 

나머지 구하기 함수 [3%2=1]

def solution(num1, num2):
    return num1 % num2
    # 예 #num1이 3, num2가 2이므로 3을 2로 나눈 나머지 1을 return 합니다.

 

두 개를 이용한 함수

def solution(money):
    americano_price = 5500
    max_coffee = money // americano_price
    remaining_money = money % americano_price
    return [max_coffee, remaining_money]

 

 

americano_price 변수에는 아메리카노 한 잔의 가격인 5,500원이 저장됩니다.

1) 주어진 돈으로 최대한으로 구매할 수 있는 아메리카노의 잔 수
max_coffee 변수에는 money를 아메리카노 한 잔의 가격으로 나눈 몫이 저장됩니다. 
2) 아메리카노를 최대한 구매한 후에 남는 돈
remaining_money 변수에는 money를 아메리카노 한 잔의 가격으로 나눈 나머지가 저장됩니다. 
3) 마지막으로, max_coffee와 remaining_money를 순서대로 담은 리스트를 반환합니다.
리스트는 [value1, value2,...]와 같이 대괄호로 묶어서 표현합니다.

예를 들어, money가 22,000원이라면, 최대로 구매할 수 있는 아메리카노의 잔 수는 4잔이고, 남는 돈은 2,200원입니다. 따라서 [4, 2200]이 반환됩니다.

 

 


 

피자 나눠 먹기  

QUESTION 01.
머쓱이네 피자가게는 피자를 일곱 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 주어질 때, 모든 사람이 피자를 한 조각 이상 먹기 위해 필요한 피자의 수를 return 하는 solution 함수를 완성해보세요.
 
 
def solution(n):
    return (n - 1) // 7 + 1
 
주어진 사람 수에서 1을 빼고 7로 나눈 몫에 1을 더함으로써 피자 조각의 개수를 구합니다.
아무리 사람이 적어도 1개는 무조건 필요하니 1에 추가로 필요한 피자를 더해주면 됩니다.

만약 피자 조각의 개수가 7의 배수이면 나눈 몫이 정확히 필요한 피자 조각의 수를 나타내므로 추가적인 계산이 필요하지 않습니다.
그리고 만약 7의 배수가 아니라면, 나머지 조각이 존재하므로 나눈 몫에 1을 더하여 필요한 피자 조각의 수를 구합니다.

예를들어 90명이 먹는다고 해봅시다.
  1. (90 - 1) = 89
  2. 89을 7로 나누면, 12
  3. 여기에 1을 더해주면, 13
def solution(n):
    return n // 7 + 1 
    
    #이렇게 해도 되지만 딱 7명이나 14명등 7배수일 경우 0판이 나올 수 있다.
    #만약 7명이나 그보다 적은 인원이라면 0+1=1 이라 1판일 수 있다.
    #그래서 아래와 같이 총 인원수에서 -1을 해준 값을 7개 슬라이스로 나누고 한판을 더하는게 나음
    
def solution(n):
    return (n - 1) // 7 + 1

 

여기서 -1 을 하는 이유
-1을 한 이유는 계산상의 특정한 경우를 처리하기 위해서입니다. 일반적으로 7로 나누고 1을 더하는 것은 '몫을 올림'하는 역할을 합니다. 그러나 경우에 따라서는 이것이 원하는 결과를 내지 못할 수 있습니다.

예를 들어, 7로 나눴을 때 나머지가 0인 경우, 즉 7, 14, 21 등의 배수인 경우입니다. 이 때는 -1을 하지 않으면 잘못된 결과가 나오게 됩니다. 따라서 이러한 예외적인 상황을 처리하기 위해 -1을 하여 원하는 동작을 구현한 것입니다.


QUESTION 02.

머쓱이네 피자가게는 피자를 2 조각에서 10 조각까지 원하는 조각 수로 잘라줍니다. 피자 조각 수 slice와 피자를 먹는 사람의 수 n이 매개변수로 주어질 때, n명의 사람이 최소 한 조각 이상 피자를 먹으려면 최소 몇 판의 피자를 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.

def solution(slice, n):
    return ((n - 1) // slice) + 1
이 함수는 주어진 피자 조각 수 slice와 피자를 먹는 사람의 수 n을 받아, n명의 사람이 최소 한 조각 이상 피자를 먹으려면 최소 몇 판의 피자를 시켜야 하는지를 반환합니다.

(n - 1)을 slice로 나눈 몫에 1을 더하여 최소 피자 판 수를 구합니다.이렇게 함으로써 각 사람이 최소한 한 조각 이상의 피자를 먹을 수 있도록 보장합니다. 한 조각으로 자르는 경우에도 한 조각만 먹는 사람이 있을 때 피자를 추가로 시켜야 한다는 점을 반영하고자 -1을 하게 됩니다.

예를 들어, slice가 7이고 n이 10이면, 한 판의 피자로 10명의 사람이 모두 한 조각 이상을 먹으려면 최소 2판의 피자가 필요합니다. 만약 slice가 10이고 n이 89명이라면, 89명의 사람이 모두 한 조각 이상을 먹기 위해 필요한 최소한의 피자 판 수는 8입니다.

 

자세한 설명

def solution(slice, n):
    # 한 판의 피자를 나눠줄 수 있는 횟수를 계산합니다.
    slices_per_pizza = slice // n
    # 남은 조각이 있는 경우 한 판을 더 추가합니다.
    if slice % n != 0:
        slices_per_pizza += 1
    return slices_per_pizza

# 예시
print(solution(10, 4))  # 3
print(solution(12, 5))  # 3
print(solution(8, 3))   # 3

 


최댓값 만들기

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.

 

def solution(numbers):
    numbers.sort()  # 입력 배열을 정렬하여 가장 큰 수가 뒤로 가도록 함
    return numbers[-1] * numbers[-2]  # 정렬된 배열에서 뒤에서 두 번째와 마지막 수를 곱하여 반환

**sort() 메서드는 리스트를 오름차순으로 정렬합니다. 따라서 정렬된 리스트에서 마지막 두 개의 수가 가장 큰 두 수입니다.

***numbers[-1]은 리스트의 마지막 원소를, numbers[-2]는 두 번째 마지막 원소를 가리킵니다.

이 함수는 주어진 정수 배열 numbers에서 두 개의 수를 선택하여 곱했을 때 최댓값을 반환합니다.

1) numbers.sort()를 사용하여 입력 배열을 정렬합니다. 이렇게 하면 가장 큰 수가 배열의 마지막에 위치하게 됩니다.
2) numbers[-1]과 numbers[-2]를 곱하여 최댓값을 계산합니다. 이렇게 함으로써 배열이 이미 정렬되었기 때문에 가장 큰 두 수를 선택할 수 있습니다. 
3) 최종적으로 두 수를 곱한 값을 반환합니다.

예를 들어, numbers가 [3, 5, 7, 2, 8]이라면, 두 개를 선택하여 곱한 최댓값은 8과 7을 곱한 56이 됩니다.

 

 


 

 

배열 두배 만들기

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요. 예를 들어, numbers[1, 2, 3, 4, 5]인 경우, 함수는 [2, 4, 6, 8, 10]을 반환.

 

def solution(numbers):
    return [num * 2 for num in numbers]
    #  num in numbers 넘버리스트 안에 있는 원소 num 중 2를 곱해줘

 

or

 

def solution(numbers):
    # 결과를 담을 리스트 초기화
    result = []
    
    # numbers의 각 원소에 대해 반복하여 두 배한 값을 결과 리스트에 추가
    for num in numbers:
        result.append(num * 2)
    
    return result

 

 

 


 

짝수 홀수 갯수

정수가 담긴 리스트 num_list가 주어질 때, num_list의 원소 중 짝수와 홀수의 개수를 담은 배열을 return 하도록 solution 함수를 완성해보세요.

 

def solution(num_list):
    # 짝수의 개수 계산
    even_count = sum(1 for num in num_list if num % 2 == 0)
    # 리스트의 전체 길이에서 짝수의 개수를 뺀 것이 홀수의 개수
    odd_count = len(num_list) - even_count
    
    # 짝수와 홀수의 개수를 담은 배열 반환
    return [even_count, odd_count]
이 함수는 주어진 정수 리스트 num_list의 원소 중 짝수와 홀수의 개수를 계산하여 배열로 반환합니다.

1) 리스트 컴프리헨션과 조건식을 사용하여 num_list의 각 원소 num에 대해 짝수인지 확인하고, 짝수인 경우에는 1을 증가시킵니다. 이를 통해 짝수의 개수를 계산합니다.
2) 전체 리스트의 길이에서 짝수의 개수를 뺀 것이 홀수의 개수입니다.
3) 최종적으로 짝수와 홀수의 개수를 담은 배열을 반환합니다.

예를 들어, num_list가 [1, 2, 3, 4, 5]이라면:
1은 홀수이므로 answer[1]을 1 증가시킵니다.2는 짝수이므로 answer[0]을 1 증가시킵니다.3은 홀수이므로 answer[1]을 1 증가시킵니다.4는 짝수이므로 answer[0]을 1 증가시킵니다.5는 홀수이므로 answer[1]을 1 증가시킵니다.
따라서 최종적으로 answer는 [2, 3]이 되어야 합니다.

or

def solution(num_list):
    answer = [0,0]
    for n in num_list:
        answer[n%2]+=1
    return answer

**리스트를 초기화하는 이유는 각각 짝수와 홀수의 개수를 저장하기 위해서입니다. 프로그램에서 리스트를 사용하여 이러한 정보를 추적할 때, 먼저 해당 변수를 적절히 초기화하여 사용합니다. 초기화하지 않으면 이후에 계산된 값들이 예기치 않게 이전에 저장된 값과 혼동될 수 있습니다.

***+=는 현재 변수의 값을 특정 값만큼 증가시키는 연산자입니다. 예를 들어, x += 1x = x + 1과 동일합니다.

 

+=1은 현재 값에 1을 더한 값을 다시 할당하는 것입니다. 따라서 answer[n%2] += 1은
n % 2의 결과가 0이면 answer 리스트의 첫 번째 요소(짝수의 개수)에 1을 더하고,
결과가 1이면 두 번째 요소(홀수의 개수)에 1을 더하는 것

 

 

- answer 리스트 초기화: 먼저, answer 리스트를 [0, 0]으로 초기화합니다.
이 리스트의 첫 번째 원소는 짝수의 개수를, 두 번째 원소는 홀수의 개수를 저장할 것입니다.

- 반복문을 통한 원소 순회: 주어진 num_list를 반복하면서 각 원소를 가져옵니다.
- 각 원소의 홀짝 여부 확인: 각 원소를 2로 나눈 나머지를 확인하여 짝수인지 홀수인지 판별합니다.
나머지가 0이면 짝수이고, 그렇지 않으면 홀수입니다.

카운트 증가: 홀수인지 짝수인지에 따라 answer 배열의 해당 인덱스 값을 1씩 증가시킵니다.

최종 결과 반환: 반복이 완료되면 answer 배열을 반환합니다. 이 배열의 첫 번째 원소는 짝수의 개수를, 두 번째 원소는 홀수의 개수를 담고 있습니다.

 

 


 

자릿수 더하기

정수 n이 매개변수로 주어질 때 n의 각 자리 숫자의 합을 return하도록 solution 함수를 완성해주세요.

def solution(n):
    return sum(map(int, str(n)))

***함수의 첫 번째 인수는 적용될 함수이고, 두 번째 인수는 해당 함수가 적용될 데이터 집합(iterable). 따라서 첫 번째 인수는 최종적으로 반환되는 값의 형태를 결정하고, 두 번째 인수는 해당 함수가 각 요소에 어떻게 적용되는지를 지정합니다.

def solution(n):
    # 정수를 문자열로 변환하여 각 자리 숫자를 리스트로 변환한 후 합을 계산하여 반환
    return sum(int(digit) for digit in str(n))
    
    #문자열로 변환하는 이유는 정수 n을 문자열로 변환하여 각 자리 숫자를 따로 처리하기 위해서입니다. 
    #숫자를 문자열로 변환하면 각 자리 숫자에 쉽게 접근할 수 있습니다. 
    #이렇게 문자열로 변환한 후에는 문자열을 순회하면서 각 자리 숫자를 정수로 변환하여 합계를 구할 수 있습니다. 
    #따라서 str 함수를 사용하여 숫자를 문자열로 변환한 것입니다.
이 함수는 주어진 정수 n의 각 자리 숫자의 합을 계산하여 반환합니다.

1) str(n): str(n)을 사용하여 정수 n을 문자열로 변환합니다.
2) for digit in str(n): 문자열을 순회하면서 각 자리 숫자를 정수로 변환하고, 그 값을 리스트로 모두 저장합니다. 문자열의 각 문자(즉, 각 자리 숫자)를 반복적으로 가져옵니다.
3) int(digit): 각 자리 숫자를 정수로 변환합니다.
4) sum() 함수를 사용하여 리스트에 저장된 모든 숫자의 합을 계산합니다.

예를 들어, n이 12345인 경우, 함수는 1 + 2 + 3 + 4 + 5 = 15를 반환합니다.

***정수를 문자열로 변환하는 이유는 각 자리 숫자에 쉽게 접근하기 위해서입니다. 문자열로 변환하면 각 숫자를 문자열의 각 문자로 쉽게 나눌 수 있습니다. 그리고 각 문자열을 다시 정수로 변환하여 각 자리 숫자에 접근할 수 있습니다. 이를 통해 각 자리 숫자를 더하여 합을 계산할 수 있습니다. 이렇게 하면 정수를 직접 다루는 것보다 간단하고 직관적으로 각 자리 숫자를 다룰 수 있습니다.


배열의 유사도

두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수(Len)를 return하도록 solution 함수를 완성해주세요.

 

def solution(s1, s2):
    # 두 배열에서 공통된 원소의 개수를 세서 반환
    return sum(1 for x in s1 if x in s2)

 

for x in s1 if x in s2

이 함수는 주어진 두 문자열 배열 s1과 s2에서 같은 원소의 개수를 세어 반환합니다.

1) 리스트 컴프리헨션과 조건식을 사용하여 s1의 각 원소 x가 s2에 존재하는지 확인합니다.
2) 조건식이 참인 경우에는 1을 증가시켜 같은 원소의 개수를 계산합니다.
3) 최종적으로 같은 원소의 개수를 반환합니다.

예를 들어, s1이 ["a", "b", "c", "d"]이고 s2가 ["b", "d", "e", "f"]인 경우, 함수는 2를 반환합니다.

 

Or

 

& 연산자를 사용하여 세트 간의 공통 요소를 반환

def solution(s1, s2):
    return len(set(s1)&set(s2));

**s1 과 s2 앞에 set 넣는 이유: 공통합을 찾는 & 연산자는 집합(Set) 타입에만 적용됩니다. 따라서 set() 함수를 사용하여 문자열을 집합으로 변환해야 합니다.

먼저
set(s1) 과 set(s2) 는 각각 문자열 s1 과 s2 의 고유한 문자들을 집합으로 변환합니다.

이후
set(s1) & set(s2) 는 두 집합의 교집합을 반환합니다.즉, 두 문자열에 공통으로 존재하는 문자들의 집합이 됩니다.

그리고
len() 함수를 사용하여 이 교집합 집합의 크기를 계산하고 반환합니다.

따라서 이 함수는 두 문자열에서 공통으로 존재하는 문자들의 개수를 반환합니다.

 


양꼬치 

머쓱이네 양꼬치 가게는 10인분을 먹으면 음료수 하나를 서비스로 줍니다. 양꼬치는 1인분에 12,000원, 음료수는 2,000원입니다. 정수 n과 k가 매개변수로 주어졌을 때, 양꼬치 n인분과 음료수 k개를 먹었다면 총얼마를 지불해야 하는지 return 하도록 solution 함수를 완성해보세요.

 

def solution(n, k):
    return 12000 * n + 2000 * (k - n // 10)

 

간단한 설명

이 함수는 양꼬치 n인분과 음료수 k개를 먹었을 때 총 얼마를 지불해야 하는지 계산하여 반환합니다.

1) 양꼬치 1인분의 가격은 12,000원으로 고정입니다.
2) 음료수 1개의 가격은 2,000원으로 고정입니다.

3) 양꼬치를 n인분 시키면서 10인분을 먹을 때마다 음료수 1개를 서비스로 제공합니다.
따라서, 양꼬치 가격과 음료수 서비스 비용을 계산하여 총 결제 금액을 계산합니다.
4) 최종적으로 총 결제 금액을 반환합니다.

예를 들어, n이 20이고 k가 3이면, 함수는 264,000을 반환합니다.

 


 

여기서 중요한 부분은 "양꼬치를 n인분 시키면서 10인분을 먹을 때마다 음료수 1개를 서비스로 제공합니다." 입니다.

   return 12000 * n + 2000 * (k // 10)
  • 12000 * n: 양꼬치의 가격을 계산합니다. 양꼬치 한 인분의 가격은 12,000원이며, n은 주문한 양꼬치의 인분 수입니다. 따라서 전체 양꼬치의 가격은 12,000원에 주문한 양꼬치의 인분 수를 곱한 값입니다.
  • 2000 * (k -  n // 10): 음료수의 가격을 계산합니다. 주문한 음료수의 가격은 2,000원이며, 이 중에 양꼬치를 10인분 주문할 때마다 한 개의 음료수가 무료로 제공되므로 (k -  n // 10)은 추가적으로 주문한 음료수의 개수입니다. 즉, 전체 음료수의 가격은 2,000원에 추가적으로 주문한 음료수의 개수를 곱한 값입니다.
  • 예를 들어, 양꼬치를 10인분 주문했고, 음료수를 총 15개 주문했다고 가정해봅시다. 이 경우 양꼬치에 대한 음료수 1개는 무료로 제공되므로 추가적으로 주문한 음료수는 총 15 - (10 // 10) = 15 - 1 = 14개가 됩니다.

자세한 설명

def solution(n, k):
    sheep_price = 12000  # 양꼬치 1인분의 가격
    drink_price = 2000   # 음료수 1개의 가격
    
    # 양꼬치의 총 가격
    total_sheep_price = n * sheep_price
    
    # 음료수의 총 가격
    total_drink_price = drink_price * k
    
    # 10인분을 먹을 때마다 음료수 1개를 무료로 받기 때문에 이를 고려하여 음료수 가격 계산
    free_drinks = n // 10  # 무료 음료수 개수
    total_drink_price -= free_drinks * drink_price
    
    # 총 지불 금액 계산
    total_price = total_sheep_price + total_drink_price
    
    return total_price
    total_drink_price -= free_drinks * drink_price
    내야할 음료수 가격 -=(공짜로 마신 음료수 갯수*음료수 가격)만큼 뺀 가격이 최종이다.

***여기서 -= 연산자는 왼쪽 변수의 값을 오른쪽 표현식의 값만큼 감소시킨다는 의미입니다.