GrepBoard/매뉴얼
84 편 ·

여러 명 일정 겹치는 시간 찾기, AI 로 표 받고 검산

·고침 ·claude-sonnet-5-5 · Python 3.13 · 2026-10-20 실행·4 단계

다섯 명이 제각각 보낸 바쁜 시간에서 모두 비는 1시간을 AI 로 찾는 방법입니다. 후보를 표로 받아 Python 계산 결과와 대조합니다.

월요일 아침 단체 메일에 답이 다 모였습니다. A 는 「월 10~12시」, B 는 「월요일 오전 내내」, C 는 「목 하루 종일 외근」, E 는 베트남 현지 시각으로 적어 보냈습니다. 이 다섯 줄에서 겹치지 않는 1시간을 손으로 찾으려면 표부터 그려야 합니다.

busy.ko.txt
[A] 월 10~12시 / 화 14:00-16:00 / 수 9시~10시 반 / 목 오후 1시부터 3시까지 / 금 11-12[B] 월요일 오전 내내, 화 15시~17시, 수 점심시간(12~13시), 목 10:00~11:30, 금 14시 이후 계속 회의[C] 월 13:00~17:00 / 화 오전 9시부터 11시 / 수 15:00-16:00 / 목 하루 종일 외근 / 금 9~10시[D] 월 12시~13시 · 화 오후 내내(1시 이후) · 수 10:00-12:00 · 목 16:00-17:00 · 금 오전 내내[E] (베트남 현지 시각, 서울보다 2시간 느림) 월 09:00-11:00, 화 09:00-12:00, 수 13:00-16:00, 목 08:00-10:00, 금 10:00-12:00

날짜는 2026-10-12(월)~16(금), 근무 시간은 서울 09~18시, 회의는 60분입니다. 이름과 시간은 지어낸 예시입니다.

짧게 시켰을 때

「모두 가능한 1시간을 찾아 주세요」와 날짜만 붙여 claude-sonnet-5-5 에 두 번 돌렸습니다. 두 번 다 수요일 13~15시를 가리켰고 정답과 맞습니다. 다만 그 둘레가 문제입니다.

  • 두 번 다 입력에 없던 말을 덧붙였습니다. 「오늘이 2026-10-20 이라 요청하신 주는 이미 지났습니다」 라는 안내인데, 입력에는 오늘 날짜가 없었습니다.
  • 월요일 17~18시를 첫 번째는 「업무시간을 18시까지로 가정한 경우에만」 가능한 차선으로, 두 번째는 「퇴근 직전이라도 괜찮다면」 후보라고 다르게 설명했습니다.
  • 13:30~14:30 은 첫 번째만 후보 예시(13:00, 13:30, 14:00 시작)에 넣었고, 두 번째는 「13:00~15:00 사이라면 어느 1시간이든」 이라고만 해서 후보가 몇 개인지 셀 수 없습니다.
  • 근무 시간은 두 번 다 모델이 「9~18시로 가정했습니다」 라고 정했습니다. 입력에 없던 값입니다.

요일별 표가 있는 답이 두 번 나왔지만 열 구성이 달라서, 후보 시각을 줄 단위로 읽어 대조할 수 있는 표는 없었습니다.

규칙과 출력 모양을 못 박기

Anthropic 의 프롬프트 문서는 원하는 출력 형식과 제약을 구체적으로 적으라고 합니다. 일반 채팅 모델은 실제 달력을 볼 수 없어서 적지 않은 가정은 알아서 채웁니다. 그래서 근무 시간·시간대·「오전 내내」의 뜻·후보 간격·표의 열을 전부 규칙으로 적습니다.

[1] 프롬프트 파일입니다. 날짜·근무 시간·회의 길이·E 의 시차 줄을 상황에 맞게 바꿉니다. 바쁜 시간은 마지막 <busy> 안에 들어갑니다.

head.ko.txt
Find 60-minute meeting slots that all five people (A–E) can attend. The busy lists inside <busy> are what each person sent, in their own format. Rules:- Dates: Monday 2026-10-12 to Friday 2026-10-16. Use Seoul time (KST) for everything you output.- Working hours are 09:00–18:00 KST. The whole meeting must fit inside them.- Person E wrote times in their local time (KST minus 2 hours). Convert to KST before comparing.- Interpret phrases like "오전 내내" (09:00–12:00), "오후 내내" (13:00–18:00), "하루 종일" (09:00–18:00) with the working hours above; "점심시간" only when a time is given next to it.- Candidate start times are every 30 minutes (09:00, 09:30, ...). A meeting may not overlap any busy time at all; touching at the boundary is fine.- Step 1: output a Markdown table of every candidate that works for all five, with exactly these columns: Date | Start | End | A | B | C | D | E. Put "free" in the person columns.- Step 2: below the table, one line "Total: N candidates".- If there are none, output exactly: None- No other text. <busy>

「경계에서 닿는 것은 괜찮다」는 12시에 끝나는 일정 뒤에 12시 회의를 잡아도 겹침으로 세지 않게 하는 줄입니다.

[2] 합쳐서 실행합니다. --tools "" 는 내장 도구를, --strict-mcp-config 는 연결해 둔 MCP 도구를 끄고, --setting-sources "" 는 내 설정·지침 파일(CLAUDE.md 등)을 읽지 않게 하고, 프롬프트는 표준 입력으로 줍니다.

console
$ (cat head.ko.txt busy.ko.txt; echo "</busy>") > prompt.ko.txt$ claude -p --model claude-sonnet-5-5 --max-turns 1 --tools "" --setting-sources "" --strict-mcp-config < prompt.ko.txt > out.ko.1.txt$ cat out.ko.1.txt| Date | Start | End | A | B | C | D | E ||---|---|---|---|---|---|---|---|| 2026-10-12 | 17:00 | 18:00 | free | free | free | free | free || 2026-10-14 | 13:00 | 14:00 | free | free | free | free | free || 2026-10-14 | 13:30 | 14:30 | free | free | free | free | free || 2026-10-14 | 14:00 | 15:00 | free | free | free | free | free | Total: 4 candidates

두 번째 실행도 글자 하나 다르지 않았습니다.

[3] 같은 바쁜 시간을 JSON 으로 옮겨 적습니다. 사람마다 [시차(분), [일정…]] 이고 일정은 「날짜 시작-끝」입니다. E 만 120분을 더해 서울 시각으로 맞춥니다.

busy.ko.json
{"work": ["09:00", "18:00"], "minutes": 60, "days": [12, 13, 14, 15, 16], "month": "2026-10", "people": {  "A": [0, ["12 10:00-12:00", "13 14:00-16:00", "14 09:00-10:30", "15 13:00-15:00", "16 11:00-12:00"]],  "B": [0, ["12 09:00-12:00", "13 15:00-17:00", "14 12:00-13:00", "15 10:00-11:30", "16 14:00-18:00"]],  "C": [0, ["12 13:00-17:00", "13 09:00-11:00", "14 15:00-16:00", "15 09:00-18:00", "16 09:00-10:00"]],  "D": [0, ["12 12:00-13:00", "13 13:00-18:00", "14 10:00-12:00", "15 16:00-17:00", "16 09:00-12:00"]],  "E": [120, ["12 09:00-11:00", "13 09:00-12:00", "14 13:00-16:00", "15 08:00-10:00", "16 10:00-12:00"]]}}

[4] 구간 겹침으로 후보를 계산해 AI 표의 앞 세 칸(날짜·시작·끝)과 비교하는 스크립트입니다. 두 구간 [s,e) 와 [a,b) 가 겹칠 조건은 s < b and a < e 이고, 끝과 시작이 같으면 겹치지 않습니다.

check.py
#!/usr/bin/env python3"""usage: check.py busy.json out.txt  — compute the slots, then compare with the AI's table"""import json, syscfg = json.load(open(sys.argv[1], encoding="utf-8"))def t(s): h, m = s.split(":"); return int(h) * 60 + int(m)spans = {d: [] for d in cfg["days"]}               # day -> busy spans in organizer timefor shift, items in cfg["people"].values():        # shift = minutes to add to this person's times    for it in items:        d, rng = it.split(); a, b = rng.split("-")        spans[int(d)].append((t(a) + shift, t(b) + shift))want = set()for d in cfg["days"]:    for s in range(t(cfg["work"][0]), t(cfg["work"][1]) - cfg["minutes"] + 1, 30):        e = s + cfg["minutes"]        if all(not (s < b and a < e) for a, b in spans[d]):   # no overlap with any busy span            want.add((f"{cfg['month']}-{d}", f"{s//60:02d}:{s%60:02d}", f"{e//60:02d}:{e%60:02d}"))rows = [[c.strip() for c in l.strip().strip("|").split("|")]        for l in open(sys.argv[2], encoding="utf-8") if l.startswith("|")]got = {tuple(r[:3]) for r in rows if r[0][:2] == "20"}        # skip header and separator rowsfor x in sorted(want - got): print("MISSING", *x)for x in sorted(got - want): print("EXTRA  ", *x)print(f"script {len(want)}, AI {len(got)}, missing {len(want-got)}, extra {len(got-want)}")sys.exit(1 if want != got else 0)
console
$ python3 -I check.py busy.ko.json out.ko.1.txt; echo "exit $?"script 4, AI 4, missing 0, extra 0exit 0

모델이 틀린 경우는 out.ko.1.txt 에서 13:30 행을 지우고 15:00 행을 손으로 끼워 넣은 out-bad.ko.txt 로 만들었습니다(모델이 만든 오류가 아닙니다).

console
$ python3 -I check.py busy.ko.json out-bad.ko.txt; echo "exit $?"MISSING 2026-10-14 13:30 14:30EXTRA   2026-10-14 15:00 16:00script 4, AI 4, missing 1, extra 1exit 1

처음 짧은 프롬프트의 답을 넣으면 후보 표가 없어서 4개가 모두 MISSING 입니다. 표 형식을 요구한 이유가 이것입니다.

빗나가는 곳

  • JSON 으로 옮겨 적는 것은 사람 일입니다. 「오전 내내」를 09~12시로 쓰면 프롬프트에 적은 뜻과 같아야 대조가 성립합니다. 다르면 AI 가 틀린 것이 아니라 해석이 달라서 어긋납니다.
  • 이 시험에서 모델이 시차를 틀린 적은 없었습니다. 다만 「E 는 서울보다 2시간 느림」 줄이 없으면 확인할 방법이 없습니다. 그 줄을 지우고 돌려 보지는 않았습니다.
  • 스크립트는 후보 시각의 집합만 비교합니다. 표의 free 칸은 보지 않습니다.

달력을 공유할 수 있으면 캘린더 앱의 일정 찾기가 정확합니다. 이 방법은 메일·메신저로 바쁜 시간만 받은 경우에 맞고, 정한 시각은 참석자에게 한 번 더 확인해야 합니다.

#meeting-time#scheduling#claude#prompt