콘텐츠로 이동

SET 19 — 서술형 모범답안


1. 출력 8

콜라츠 추측에 따라 n을 반복 변환합니다: 6→3→10→5→16→8→4→2→1. 짝수면 2로 나누고 홀수면 3n+1을 적용하며, n1이 될 때까지 걸린 변환 횟수가 steps입니다. 한 단계씩 세어보면 총 8번의 변환이 일어납니다.

2. 출력 [('Lee', 90), ('Choi', 90), ('Kim', 85), ('Park', 85)]

key=lambda x: -x[1]은 점수를 기준으로 내림차순 정렬합니다. 파이썬의 sort()안정 정렬(stable sort)이므로 점수가 같은 원소들은 원래 리스트에서의 상대적 순서를 유지합니다. 점수 90Lee, Choi 중 원래 Lee가 먼저였으므로 그대로 Lee가 먼저 오고, 점수 85Kim, Park도 원래 순서(Kim이 먼저) 그대로 유지됩니다.

3. 출력 8.0 8 <class 'float'> <class 'int'>

math.pow()는 인자의 타입과 관계없이 항상 float을 반환하므로 math.pow(2, 3)8.0입니다. 반면 ** 연산자는 두 정수의 거듭제곱일 때 결과도 int로 유지하므로 2 ** 38입니다. 값은 같아도 타입이 다릅니다.

4. 출력 True False True True

__eq__x, y 값만 비교하도록 재정의되어 있으므로, p1p2는 서로 다른 객체이지만 좌표 값이 같아 p1 == p2True입니다. 하지만 is는 객체 자체가 같은지를 비교하므로 p1 is p2False입니다. p3 = p1은 같은 객체를 가리키는 또 다른 이름이므로 p1 == p3p1 is p3는 모두 True입니다.

5.

def invert_dict(d):
    return {v: k for k, v in d.items()}

6.

def closest_pair(points):
    return min(points, key=lambda p: p[0] ** 2 + p[1] ** 2)

7.

def unique_chars(s1, s2):
    return sorted(set(s1) ^ set(s2))

8.

문제: utils/__init__.pymath_tools.py에서 addsub만 가져왔고 mul은 가져오지 않았습니다. mulmath_tools 모듈 안에는 존재하지만 utils 패키지의 속성으로 등록되지 않았으므로, utils.mul(2, 3)을 호출하면 AttributeError가 발생합니다(utils.add(2, 3)은 정상적으로 5를 출력합니다).

고친 코드:

# utils/__init__.py
from .math_tools import add, sub, mul

# main.py
import utils
print(utils.add(2, 3))
print(utils.mul(2, 3))