문제를 정확하게 적기
문제를 읽자마자 코드를 쓰지 말고 무엇을 받아 무엇을 돌려줄지 한 문장으로 적어 보세요. ‘가장 큰 수 찾기’에도 빈 입력을 허용하는지, 음수가 들어오는지 같은 조건이 필요합니다.
네 가지를 정합니다
- 입력: 정수 목록을 받습니다. 음수와 중복 값을 허용합니다.
- 출력: 가장 큰 정수 하나를 반환합니다.
- 경계 조건: 목록이 비면 값이 없다는 뜻의
None을 반환합니다. - 제약: 입력을 바꾸지 않고 한 번만 훑습니다.
def maximum(values):
if not values:
return None
best = values[0]
for value in values:
if value > best:
best = value
return best
print(maximum([-8, -2, -6]))
print(maximum([]))
출력은 -2, None입니다. 최댓값을 처음부터 0으로 두면 음수만 있는 입력에서 틀립니다. 주어진 값에서 출발해야 올바른 후보를 유지합니다.
맞는 이유를 설명해 봅시다
반복할 때마다 best는 지금까지 본 값 중 최댓값입니다. 첫 항목을 넣을 때 이 말이 맞고, 더 큰 값이 나오면 갱신하므로 계속 맞습니다. 모든 항목을 본 뒤에는 전체의 최댓값입니다.
이처럼 반복하는 동안 유지되는 조건을 루프 불변식이라고 합니다. 시작할 때 맞는지, 한 번 실행해도 유지되는지, 끝났을 때 원하는 결론이 나오는지 살펴봅니다. 예제 몇 개의 통과보다 넓은 근거입니다.
입력 파일과 함수는 구분하세요
알고리즘 문제는 표준 입력으로 값을 받기도 합니다. 터미널의 python3 solution.py < input.txt는 파일 내용을 표준 입력으로 보내는 리다이렉션입니다. 이 강좌에서는 핵심 절차를 보기 쉽게 함수에 작은 값을 직접 전달합니다.
확인 문제
[5, 5], [-7], []의 결과는 각각 무엇일까요? 결과 대신 최댓값의 위치를 반환하라는 요청을 받으면 무엇을 먼저 정해야 할까요?
해설 보기
결과는 5, -7, None입니다. 위치를 반환한다면 같은 최댓값이 여러 개일 때 첫 위치를 줄지, 마지막 위치를 줄지 정해야 합니다. 빈 입력의 결과도 다시 명시해야 합니다.