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()