JetBrain AI Assistant를 이용하여 근무시간표를 짜주는 스크립트를 만들어 보았다.
1차 도전 ChatGPT 4o로 모델을 설정하고 아래와 같이 요청했다.
아래 조건에 해당하는 엑셀 파일을 생성하는 파이썬 스크립트를 만들어 주세요.
1. xx년 yy월을 입력 받아서 해당 연월의 달력을 만들어주세요
2. 일요일은 빨간색 글자로 표시해 주세요.
3. 토요일은 파란색 글자로 표시해 주세요.
4. 휴일은 빨간색 글자로 표시해 주세요.
5. 휴일을 설정할 수 있는 holiday 필드를 만들어 주세요
6. 근무자 리스트를 입력 할 수 있는 worker 리스트 변수를 만들어 주세요
7. 근무자 리스트에는 아래와 같은 형식의 딕셔너리 자료구조를 이용해서 근무자의 제한 조건을 받게 해주세요
{최대 근무일수: N, 휴일근무가능: Yes or No, 일요일 근무 가능: Yes or No, 토요일 근무 가능: Yes or No, 근무 불가 날짜 리스트:[]}
8. 각 날짜 아래에는 근무자 이름이 표시되게 해주세요.
작성된 코드를 실행하니 뭐가 하나씩 부족했다.
몇번을 버그리포팅을 하다가, ChatGPT o1으로 모델을 변경하고, 다시 작성을 요청했다.
import calendar
from itertools import cycle
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment
def create_calendar(year, month, holidays, workers):
# '일요일'을 주의 시작으로 설정
calendar.setfirstweekday(calendar.SUNDAY)
# monthdayscalendar: 한 달을 주 단위로 나눈 2차원 리스트 반환
# 예: [[0, 0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11, 12], ...]
# -> [일, 월, 화, 수, 목, 금, 토]
month_matrix = calendar.monthcalendar(year, month)
# 워크북 및 워크시트 생성
wb = Workbook()
ws = wb.active
ws.title = f"{year}년 {month}월"
# 헤더 (일~토)
headers = ["일", "월", "화", "수", "목", "금", "토"]
for col, header in enumerate(headers, start=1):
cell = ws.cell(row=1, column=col)
cell.value = header
cell.font = Font(bold=True)
cell.alignment = Alignment(horizontal="center")
# 색상 스타일
red_font = Font(color="FF0000") # 빨간색 → 일요일 / 공휴일
blue_font = Font(color="0000FF") # 파란색 → 토요일
# 근무자 순환 (cycle)
worker_cycle = cycle(workers)
# 달력에 날짜 및 근무자 표시
# month_matrix는 각 주(week)에 대해 일~토(7개) 날짜를 리스트로 갖고 있음
# 일자(day_num)가 0이면 그 주에 해당 요일은 비어있음을 의미
# 주마다 2줄(첫 줄: 날짜, 둘째: 근무자)
start_row = 2
for week_index, week in enumerate(month_matrix):
# 한 주의 날짜들을 표시할 행(week_row) 계산
# 첫 번째 주 -> start_row=2, 두 번째 주 -> 4, 세 번째 주 -> 6, ...
week_row = start_row + (week_index * 2)
for col_index, day_num in enumerate(week, start=1):
if day_num == 0:
# 0이면 해당 칸이 비어있는 날이므로 건너뜀
continue
# 날짜 표시 (week_row 행, col_index 열)
day_cell = ws.cell(row=week_row, column=col_index)
day_cell.value = day_num
day_cell.alignment = Alignment(horizontal="center")
# 요일별 색상 설정
if col_index == 1: # 일요일 (컬럼 1)
day_cell.font = red_font
elif col_index == 7: # 토요일 (컬럼 7)
day_cell.font = blue_font
# 공휴일(holidays)에 해당한다면 빨간색 추가 적용
if day_num in holidays:
day_cell.font = red_font
# 근무자 표시 (날짜 아래 한 줄)
worker_cell = ws.cell(row=week_row + 1, column=col_index)
worker = next(worker_cycle, None)
worker_cell.value = worker["이름"] if worker else ""
worker_cell.alignment = Alignment(horizontal="center")
# 엑셀 파일 저장
file_name = f"{year}_{month}_calendar.xlsx"
wb.save(file_name)
print(f"{file_name} 파일이 생성되었습니다!\n")
# 테스트용 코드
if __name__ == "__main__":
year = 2023
month = 11
holidays = [5, 15, 25]
workers = [
{"이름": "홍길동", "최대 근무일수": 5, "휴일근무가능": "Yes", "일요일 근무 가능": "No", "토요일 근무 가능": "Yes", "근무 불가 날짜 리스트": [5]},
{"이름": "김철수", "최대 근무일수": 7, "휴일근무가능": "No", "일요일 근무 가능": "Yes", "토요일 근무 가능": "No", "근무 불가 날짜 리스트": [12]},
{"이름": "박영희", "최대 근무일수": 6, "휴일근무가능": "Yes", "일요일 근무 가능": "Yes", "토요일 근무 가능": "Yes", "근무 불가 날짜 리스트": [20]},
]
create_calendar(year, month, holidays, workers)
몇 번의 추가 질문 끝에 위와 같은 스크립트를 얻을 수 있었다.
결론적으로, AI를 잘 쓰기 위해서는 개인의 수련이 필요한 것 같다.
'Coding > Python 삽질기' 카테고리의 다른 글
[Python] Jupyter notebook 팁 (0) | 2024.05.11 |
---|---|
[SQL] BEGIN TRANSACTION (0) | 2024.03.07 |
Cardioid 그리기 (0) | 2024.02.17 |