콘텐츠로 이동

SET 20 — 서술형 모범답안


1. 출력 5 6

cache={}는 함수 정의 시 단 한 번만 생성되는 기본값이며, 재귀 호출마다 같은 딕셔너리를 계속 전달해 채워나갑니다. memo_fib(5)를 계산하는 과정에서 cache에는 n=0부터 n=5까지의 값이 모두 저장되므로 최종적으로 len(cache)6입니다. 피보나치 수열(0,1,1,2,3,5)에 따라 memo_fib(5)5입니다. memo_fib.__defaults__[0]은 바로 이 기본값 딕셔너리 자체를 가리킵니다.

2. 출력 {4: 'even', 5: 'odd', 6: 'even', 7: 'odd', 8: 'even'}

먼저 if n > 3 조건으로 4, 5, 6, 7, 8만 남기고, 각 값에 대해 짝수면 "even", 홀수면 "odd"를 매핑한 딕셔너리를 만듭니다.

3. 출력 [[99, 2], [3, 4]] [[99, 2], [3, 4], [5, 6]]

a[:]는 바깥쪽 리스트만 새로 복사하는 얕은 복사이므로, b의 안쪽 리스트들([1,2], [3,4])은 a같은 객체를 공유합니다. b.append([5, 6])b의 바깥 리스트에만 새 원소를 추가하므로 a에는 영향이 없습니다. 하지만 b[0][0] = 99는 공유된 안쪽 리스트를 직접 수정하는 것이라 a에도 그대로 반영됩니다.

4. 출력 6 True

random.sample()은 주어진 범위에서 중복 없이 지정한 개수만큼 뽑으므로 길이는 항상 6이고, 뽑힌 값들을 집합으로 바꿔도 개수가 줄지 않아(len(set(sample)) == len(sample)) 항상 True입니다.

5.

class Inventory:
    def __init__(self):
        self.stock = {}

    def add(self, item, qty):
        self.stock[item] = self.stock.get(item, 0) + qty

    def remove(self, item, qty):
        current = self.stock.get(item, 0)
        self.stock[item] = max(0, current - qty)

    def get(self, item):
        return self.stock.get(item, 0)

6.

def group_by_parity(nums):
    evens = [n for n in nums if n % 2 == 0]
    odds = [n for n in nums if n % 2 != 0]
    return evens, odds

7.

def is_subset_of_any(small, list_of_sets):
    return any(small <= s for s in list_of_sets)

8.

문제: __str__ 안에서 self.to_fahrenheit() 없이 참조하면 메서드를 호출하지 않고 메서드 객체 자체를 가져오게 됩니다. 따라서 f"...{self.to_fahrenheit}F"는 화씨 온도 숫자가 아니라 <bound method Temperature.to_fahrenheit of ...>처럼 메서드 객체의 표현이 그대로 문자열에 끼어들어 출력됩니다.

고친 코드:

class Temperature:
    def __init__(self, celsius):
        self.celsius = celsius
    def to_fahrenheit(self):
        return self.celsius * 9 / 5 + 32
    def __str__(self):
        return f"{self.celsius}C = {self.to_fahrenheit()}F"

t = Temperature(100)
print(t)