[CS-012][실무] 작은 학습 계획 도구 설계하고 검증하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[CS-012][실무] 작은 학습 계획 도구 설계하고 검증하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 76회 작성일 26-09-06 04:34

본문

[이번 수업]

아이디어를 확인 가능한 요구사항으로 바꾸고 자료구조와 알고리즘을 골라 구현·검증하는 실습입니다. 제한 시간 안에 학습 과제를 고르는 작은 도구를 만듭니다.

[선수지식]

CS-003의 함수, CS-004의 리스트, CS-006의 복잡도, CS-007의 정렬을 알면 좋습니다. Python 기본 문법을 사용합니다.

[학습목표]

1. 문제를 입력·규칙·출력·오류 조건으로 나눈다.
2. 자료구조와 정렬 기준을 정한다.
3. 정상·경계·오류 사례로 검증한다.

[핵심개념]

입력은 id·소요 시간·우선순위·완료 여부가 있는 과제 목록과 시간 예산입니다. 완료 과제는 제외하고, 우선순위 3부터 보며 같으면 짧은 과제와 id 순으로 정렬합니다. 앞에서부터 남은 시간에 들어가는 과제만 고릅니다. 출력은 선택 id, 사용 시간, 남은 시간입니다. 음수 예산, 0 이하 시간, 중복 id는 오류입니다.

이 규칙은 모든 조합의 최고 점수를 찾는 최적화가 아니라 정해진 순서를 따르는 정책입니다. 입력 확인, 후보 추리기, 정렬, 선택, 출력으로 나누면 각 단계를 시험하기 쉽습니다. 리스트는 과제 순서를, 딕셔너리는 한 과제의 필드를 담습니다. 처리 시간은 후보 정렬의 영향이 가장 큽니다.

[따라하기]

study_plan.py를 만들고 붙여 넣으세요. 추가 패키지는 없습니다.

```python
import json

def make_plan(tasks, budget):
    if budget < 0:
        raise ValueError("시간 예산은 0 이상이어야 합니다")

    ids = [task["id"] for task in tasks]
    if len(ids) != len(set(ids)):
        raise ValueError("과제 id는 중복될 수 없습니다")
    if any(task["minutes"] <= 0 or task["priority"] not in {1, 2, 3} for task in tasks):
        raise ValueError("시간과 우선순위를 확인하세요")

    candidates = sorted(
        (task for task in tasks if not task["done"]),
        key=lambda task: (-task["priority"], task["minutes"], task["id"]),
    )

    selected = []
    remaining = budget
    for task in candidates:
        if task["minutes"] <= remaining:
            selected.append(task["id"])
            remaining -= task["minutes"]

    return {"selected": selected, "used": budget - remaining, "remaining": remaining}

tasks = [
    {"id": "T1", "minutes": 25, "priority": 2, "done": False},
    {"id": "T2", "minutes": 15, "priority": 3, "done": False},
    {"id": "T3", "minutes": 20, "priority": 3, "done": True},
    {"id": "T4", "minutes": 20, "priority": 2, "done": False},
    {"id": "T5", "minutes": 10, "priority": 1, "done": False},
]

result = make_plan(tasks, 40)
assert result == {"selected": ["T2", "T4"], "used": 35, "remaining": 5}
print(json.dumps(result, ensure_ascii=False, indent=2))
```

macOS·Linux에서는 `python3 study_plan.py`, Windows에서는 `py study_plan.py`를 실행합니다. 환경에 따라 `python`도 됩니다. 예상 결과는 selected가 T2·T4, used가 35, remaining이 5인 JSON입니다. assert 실패는 기대값과 결과가 다르다는 뜻입니다.

[흔한 실수]

코드부터 쓰면 동률 규칙이 빠지기 쉽습니다. 예제 하나만 맞추거나 구현 뒤 요구사항을 바꾸지 마세요. 앞에서 고르는 정책을 모든 조합의 최적해라고 부르는 것도 잘못입니다.

[보안 주의]

실제 서비스에서는 입력의 키·자료형·길이·숫자 범위를 검사하세요. 오류에 사용자 정보나 내부 경로를 넣지 말고 원본 입력을 로그에 남기지 않습니다. 실습은 본인 소유의 로컬 환경과 가짜 과제만 사용합니다.

[직접 해볼 과제]

예산 0과 중복 id 오류 사례를 assert로 추가하세요. 같은 우선순위에서 짧은 시간을 먼저 보는지 확인할 과제 두 개도 만들어 검증하세요.

[확인문제]

1. 구현 전에 입력·규칙·출력·오류 조건을 적는 이유는 무엇인가요?
2. 이 알고리즘이 모든 조합의 최적해를 보장하지 않는 이유는 무엇인가요?
3. 완료 과제를 먼저 제외하면 무엇이 단순해지나요?

[다음 학습]

TOOL-012에서 이 프로그램을 새 컴퓨터에서도 실행할 수 있는 개발환경으로 정리합니다.

[공식 참고 자료]

https://swehb.nasa.gov/spaces/SWEHBVB/pages/32604503/SWE-050+-+Software+Requirements
https://docs.python.org/3/tutorial/datastructures.html
https://docs.python.org/3/howto/sorting.html
https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
1,473
어제
5,103
최대
16,772
전체
772,527
Copyright © 소유하신 도메인. All rights reserved.