# 모의 수강신청📑

- 수강신청이 처음인 신입생들을 위한 모의 수강신청!

모의 수강신청 코딩

```
import re

class Course:
    def __init__(self, code, name, max_students, schedule):
        self.code = code
        self.name = name
        self.max_students = max_students  # 정원 20명으로 설정
        self.schedule = self.parse_schedule(schedule)  # 리스트로 저장됨
        self.schedule_raw = schedule  # 사용자에게 보여줄 원래 형식
        self.enrolled_students = 0

    def is_available(self):
        return self.enrolled_students < self.max_students

    def enroll(self):
        if self.is_available():
            self.enrolled_students += 1
            return True
        return False

    def cancel(self):
        if self.enrolled_students > 0:
            self.enrolled_students -= 1
            return True
        return False

    def parse_schedule(self, schedule_str):
        # e.g. "월/수 09:00-10:30"
        days_part, time_part = schedule_str.split(" ")
        days = days_part.split("/")
        start_time, end_time = time_part.split("-")
        start_minutes = self.to_minutes(start_time)
        end_minutes = self.to_minutes(end_time)
        return [(day, start_minutes, end_minutes) for day in days]

    def to_minutes(self, time_str):
        hours, minutes = map(int, time_str.split(":"))
        return hours * 60 + minutes

class Student:
    def __init__(self):
        self.enrolled_courses = []

    def has_schedule_conflict(self, new_course):
        for new_day, new_start, new_end in new_course.schedule:
            for course in self.enrolled_courses:
                for day, start, end in course.schedule:
                    if day == new_day and not (new_end <= start or new_start >= end):
                        return True, course
        return False, None

    def add_course(self, course):
        if course in self.enrolled_courses:
            print("⚠️ 이미 신청한 과목입니다.")
            return
        conflict, conflicting_course = self.has_schedule_conflict(course)
        if conflict:
            print(f"❌ 시간표가 겹칩니다: [{conflicting_course.name}] 와 [{course.name}]")
            return
        if course.enroll():
            self.enrolled_courses.append(course)
            print(f"✅ {course.name} 과목을 신청했습니다.")
        else:
            print("⚠️ 정원이 초과되어 신청할 수 없습니다.")

    def drop_course(self, course):
        if course in self.enrolled_courses:
            course.cancel()
            self.enrolled_courses.remove(course)
            print(f"✅ {course.name} 과목을 취소했습니다.")
        else:
            print("⚠️ 신청한 과목이 아닙니다.")

    def list_courses(self):
        if not self.enrolled_courses:
            print("📭 신청한 과목이 없습니다.")
        else:
            print("📋 신청한 과목 목록:")
            for course in self.enrolled_courses:
                print(f"- {course.name} ({course.code}) / 시간: {course.schedule_raw}")

def main():
    courses = [
        Course("CS101", "컴퓨터개론", 20, "월/수 09:00-10:30"),
        Course("MATH101", "미적분학", 20, "수/금 09:30-11:00"),
        Course("ENG101", "영어회화", 20, "화/목 13:00-15:00"),
        Course("HIST101", "한국사", 20, "금 09:00-10:00"),
    ]

    student = Student()

    while True:
        print("\n[모의 수강신청 시스템]")
        print("1. 과목 목록 보기")
        print("2. 과목 신청")
        print("3. 과목 취소")
        print("4. 신청한 과목 보기")
        print("5. 종료")
        choice = input("원하는 메뉴 번호를 입력하세요: ")

        if choice == '1':
            print("\n[과목 목록]")
            for course in courses:
                status = f"{course.enrolled_students}/{course.max_students}"
                print(f"{course.code} - {course.name} | 시간: {course.schedule_raw} | 정원: {status}")
        elif choice == '2':
            code = input("신청할 과목 코드를 입력하세요: ").upper()
            selected = next((c for c in courses if c.code == code), None)
            if selected:
                student.add_course(selected)
            else:
                print("❗ 존재하지 않는 과목입니다.")
        elif choice == '3':
            code = input("취소할 과목 코드를 입력하세요: ").upper()
            selected = next((c for c in courses if c.code == code), None)
            if selected:
                student.drop_course(selected)
            else:
                print("❗ 존재하지 않는 과목입니다.")
        elif choice == '4':
            student.list_courses()
        elif choice == '5':
            print("👋 수강신청 프로그램을 종료합니다.")
            break
        else:
            print("⚠️ 올바른 번호를 입력해주세요.")

if __name__ == "__main__":
    main()

```

## 코딩 복사 후 아래 사이트 접속해서 붙여넣기 후 RUN 실행

[Online Python - IDE, Editor, Compiler, Interpreter](https://www.online-python.com/)

For the site tree, see the [root Markdown](https://slashpage.com/%EC%9C%A4%EC%A7%80%EC%84%B1-uyz3t.md).
