AI가 정리한 일정표를 검토할 때는 두 질문을 나눠야 합니다. “같은 사람이 두 업무를 동시에 해야 하는가?”와 “앞 업무를 마친 뒤 다음 장소에 도착할 수 있는가?”입니다. 시간이 겹치지 않는다고 실행 가능한 일정이 되는 것은 아닙니다.
네이버에 쓴 일정 검토 예제를 바탕으로, 이번에는 같은 계산을 Python으로 재현합니다. 아래 일정과 수정안은 모두 설명용 합성 데이터입니다. 실제 AI 응답이나 실제 사람의 일정이 아닙니다.
1. 계산보다 먼저 고정할 조건
이 예제에서는 한 사람이 같은 날짜·시간대 안에서 A→B→C→D 순서로 업무를 수행합니다.
- 사무실과 교육실을 오가는 데는 어느 방향이든 20분이 필요합니다. 실제 측정값이 아닌 입력 조건입니다.
- A와 B의 시작·종료 시각은 고정합니다.
- C와 D는 뒤로 옮길 수 있지만 업무 시간은 각각 20분, 30분으로 유지합니다.
- 모든 업무는 12:00까지 끝나야 합니다.
- 같은 장소에서는 앞 업무가 끝나자마자 다음 업무를 시작할 수 있다고 가정합니다. 휴식·준비 시간은 넣지 않았습니다.
| 업무 | 시간 | 장소 |
|---|---|---|
| A · 자료 정리 | 09:00–09:30 | 사무실 |
| B · 교육 참석 | 10:00–10:30 | 교육실 |
| C · 질의 정리 | 10:20–10:40 | 교육실 |
| D · 결과 기록 | 10:50–11:20 | 사무실 |
2. 겹침은 모든 업무 쌍에서 계산
시작·종료 시각을 자정부터 지난 분으로 바꾸면 비교가 간단해집니다. 10:20은 620분, 10:30은 630분입니다. 두 구간의 겹치는 분 수는 다음과 같습니다.
겹침 = max(0, min(종료1, 종료2) - max(시작1, 시작2)) B와 C는 min(630, 640) - max(600, 620) = 10분 겹칩니다. 같은 장소라도 한 사람이 두 업무에 모두 참석해야 하므로 충돌입니다.
끝나는 순간에 다음 업무가 시작하면 겹침을 0으로 봅니다. 구간을 [시작, 종료)로 해석하는 셈입니다. 네 업무는 가능한 여섯 쌍을 모두 비교합니다. 시작 시각으로 정렬한 뒤 이웃한 행만 검사하면, 긴 업무 안에 들어간 다른 업무와의 충돌을 놓칠 수 있습니다.
3. 이동은 정해진 방문 순서에서 검사
서로 다른 장소로 이동하는 구간은 다음 조건도 만족해야 합니다.
이동 가능 시간 = 다음 업무 시작 - 앞 업무 종료 부족한 시간 = max(0, 필요한 이동 시간 - 이동 가능 시간) A→B는 간격 30분에서 이동 20분을 빼면 10분이 남습니다. 반면 C→D는 간격이 10분뿐이라 10분 부족합니다. C와 D 자체는 겹치지 않으므로, 겹침 검사만으로는 이 문제를 찾을 수 없습니다.
아래 코드는 목록의 순서를 방문 순서로 사용합니다. 같은 장소의 겹침은 앞의 쌍별 검사에서 찾고, 장소가 바뀌는 구간의 이동 부족을 따로 반환합니다. 두 목록의 숫자는 모두 분 단위이며, office는 사무실, room은 교육실입니다.
복사해서 실행할 수 있는 코드
from itertools import combinations def minute(text): hour, minutes = map(int, text.split(":")) return 60 * hour + minutes def event(name, start, end, place): return (name, minute(start), minute(end), place) def inspect(plan): assert all(0 <= start < end <= 24 * 60 for _, start, end, _ in plan) overlaps = [] for a, b in combinations(plan, 2): overlap = max(0, min(a[2], b[2]) - max(a[1], b[1])) if overlap: overlaps.append((a[0], b[0], overlap)) travel_shortfalls = [] for a, b in zip(plan, plan[1:]): if a[3] == b[3]: continue gap = b[1] - a[2] if gap < 20: travel_shortfalls.append((a[0], b[0], 20 - gap)) return overlaps, travel_shortfalls original = [ event("A", "09:00", "09:30", "office"), event("B", "10:00", "10:30", "room"), event("C", "10:20", "10:40", "room"), event("D", "10:50", "11:20", "office"), ] revised = original[:2] + [ event("C", "10:30", "10:50", "room"), event("D", "11:10", "11:40", "office"), ] assert inspect(original) == ([("B", "C", 10)], [("C", "D", 10)]) assert inspect(revised) == ([], []) assert revised[:2] == original[:2] assert [x[0] for x in revised] == [x[0] for x in original] assert [x[3] for x in revised] == [x[3] for x in original] assert [x[2] - x[1] for x in revised] == [x[2] - x[1] for x in original] assert revised[-1][2] <= minute("12:00") print(inspect(original)) print(inspect(revised)) 출력은 다음과 같습니다.
([('B', 'C', 10)], [('C', 'D', 10)]) ([], []) 첫 번째 목록은 겹치는 업무 쌍, 두 번째 목록은 이동 시간이 부족한 구간입니다. assert는 두 결과뿐 아니라 고정 업무 A·B, 업무 ID의 순서, 장소, 업무 시간과 마감 시각도 확인합니다. 예제의 입력 자체가 A→B→C→D 순서이므로 코드가 자동으로 재정렬하지는 않습니다.
4. 한 업무를 옮기면 뒤의 이동도 다시 계산
C를 10:30–10:50으로 옮기면 B와의 겹침은 사라집니다. 하지만 D를 10:50에 그대로 두면 이동 시간이 0분이 됩니다. 수정은 여기서 끝낼 수 없습니다.
| 업무 | 수정 후 시간 | 변경 |
|---|---|---|
| A | 09:00–09:30 | 유지 |
| B | 10:00–10:30 | 유지 |
| C | 10:30–10:50 | 10분 뒤로 이동 |
| D | 11:10–11:40 | 20분 뒤로 이동 |
수정 후 업무 사이 간격은 30분, 0분, 20분입니다. B와 C는 같은 장소여서 맞닿아도 되고, C→D는 이동 20분을 확보합니다. 마지막 종료는 11:40으로 마감보다 20분 빠릅니다.
이것은 조건을 만족하는 수정안 하나입니다. 최적의 배치나 일반적인 일정 최적화 알고리즘을 제시하는 것은 아닙니다.
5. AI에게도 계산 기준을 명시하기
위 조건과 일정표를 함께 주고 다음처럼 요청할 수 있습니다.
모든 업무 쌍의 시간 겹침과, 정해진 순서에서 장소가 바뀌는 구간의 이동 부족을 따로 검사해 줘. 문제마다 업무 ID, 비교한 시작·종료 시각, 겹치는 분 수 또는 부족한 분 수를 보여 줘. 고정 시각·순서·업무 시간·마감을 유지하는 수정안 하나를 제안하고 같은 검사를 다시 해 줘. 입력에 없는 소요 시간이나 이동 시간은 추측하지 말고 “확인 필요”로 표시해 줘.
원하는 형식과 제약을 구체적으로 쓰는 방식은 Anthropic의 공식 프롬프트 안내와 맞닿아 있습니다. 환각을 줄이는 공식 안내도 불확실성을 인정하게 하고 중요한 정보를 검증하도록 권합니다. 다만 이런 요청문이 계산 정확도나 최적해를 보장하지는 않습니다.
이 코드는 같은 날짜·시간대의 한 사람 일정과 고정된 방문 순서만 다룹니다. 여러 참여자, 자정을 넘는 일정, 시간대 변환, 방향별로 다른 이동 시간, 실시간 교통 상황에는 그대로 적용하면 안 됩니다. 필요한 휴식·준비 시간도 별도 조건으로 넣어야 합니다.
AI 활용 고지: 이 글의 재구성과 예제 코드 작성은 AI 에이전트가 수행했습니다. 합성 입력의 겹침·이동 부족·업무 시간·마감을 Python으로 검산했습니다. AI 서비스에 이 요청문을 실행하거나 캘린더에 실제 일정을 등록한 사례는 아닙니다.


