Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
183 changes: 183 additions & 0 deletions _jehui/17512.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "9d68b7b9",
"metadata": {},
"source": [
"# 첫번째 시도"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "65521161",
"metadata": {},
"outputs": [],
"source": [
"import heapq\n",
"q = []\n",
"N, K = map(int, input().split())\n",
"for table in range(1, K+1):\n",
" num, w = map(int, input().split())\n",
" heapq.heappush(q, [w, -table, num])\n",
"\n",
"next_person = K + 1\n",
"result = 0\n",
"mul_num = 1\n",
"while q:\n",
" # 가장 빨린 끝난 사람 종료\n",
" end_w, end_table, end_num = heapq.heappop(q)\n",
" # 정답 갱신\n",
" result += mul_num * end_num\n",
" mul_num += 1\n",
" # 남은 시간\n",
" for i in range(len(q)):\n",
" q[i][0] -= end_w\n",
" if next_person < N+1:\n",
" # 새로운 사람 등장\n",
" num, w = map(int, input().split())\n",
" heapq.heappush(q, [w, end_table, num]) \n",
" # 다음 사람\n",
" next_person += 1\n",
"print(result)"
]
},
{
"cell_type": "markdown",
"id": "82c0eea4",
"metadata": {},
"source": [
"[문제]\n",
"- 시간 초과\n",
"- 13900이 나와야 하는데, 13942가 나옴.<br>\n",
"\n",
"[시간복잡도]<br>\n",
"O(N*K)"
]
},
{
"cell_type": "markdown",
"id": "ba08a144",
"metadata": {},
"source": [
"# 피드백\n",
"## 1. 로직 / 정확도 관점에서 문제점\n",
"1. N < K일 때 입력 초과\n",
"```py\n",
"for table in range(1, K+1):\n",
" num, w = map(int, input().split())\n",
"```\n",
"N이 K보다 작으면, 존재하지 않는 줄을 읽으려고 해서 바로 런타임 에러 터짐.\n",
"→ range(1, min(N, K)+1) 로 해야 돼.\n",
"\n",
"2. “가장 적게 기다리는 계산대” 규칙이 제대로 구현 안 됨\n",
"\n",
"지금 로직은:\n",
"- 처음 K명은 계산대 1~K에 한 명씩.\n",
"- 이후엔 항상 방금 끝난 계산대에만 다음 사람을 붙임.\n",
"\n",
"하지만 문제는 “현재까지의 예상 대기시간이 가장 짧은 계산대”를 골라야 하니까,\n",
"실제로는 K개의 계산대 각각의 누적 작업량(언제 비는지) 를 관리하면서\n",
"항상 그중 최소인 계산대에 배정해야 해.\n",
"\n",
"지금 코드는 “끝나는 순서대로만 붙이는” 방식이라\n",
"원래 문제의 시뮬레이션이랑은 좀 다름. -> 동시에 끝나면 번호 작은곳에 넣어야 하는데, 지금은 그냥 번호 큰곳에 넣고 있음\n",
"\n",
"3. 시간을 계속 깎는 방식 자체가 비효율적\n",
"한 번 pop할 때마다 for i in range(len(q)): 로\n",
"모든 사람의 남은 시간을 줄이는 설계가 문제의 원인이야.\n",
"\n",
"사실 이건 안 해도 되고, “절대 시각(완료 시간)” 만 관리하면 돼.\n",
"\n",
"## 2. 어떻게 바꿔야 하는지 (권장 방식)\n",
"### 핵심 아이디어\n",
"\n",
"- 계산대 힙: (현재까지의 누적 시간, 계산대 번호)\n",
"→ 새 손님을 항상 이 힙의 top 계산대에 배정\n",
"\n",
"- 동시에, 각 손님의 퇴장 정보를 (퇴장시간, -계산대번호, 회원번호) 형태로 배열에 모아서\n",
"마지막에 정렬한 뒤, 1×r₁ + 2×r₂ + … 계산.\n",
"\n",
"이렇게 하면 매 손님당\n",
"- 힙 pop + push → O(log K)\n",
"\n",
"이므로 전체:\n",
"O(N log K) (+ 마지막 정렬 O(N log N))\n",
"정도로 깔끔하게 떨어져."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "194151e6",
"metadata": {},
"outputs": [],
"source": [
"import heapq\n",
"import sys\n",
"input = sys.stdin.readline\n",
"\n",
"N, K = map(int, input().split())\n",
"customers = [tuple(map(int, input().split())) for _ in range(N)] # (id, w)\n",
"\n",
"pq = [] # (finish_time, counter_idx, customer_id)\n",
"exit_list = [] # (finish_time, -counter_idx, id)\n",
"\n",
"cnt = min(N, K)\n",
"\n",
"# 처음 K명 계산대 배치\n",
"for i in range(cnt):\n",
" cid, w = customers[i]\n",
" heapq.heappush(pq, (w, i+1, cid)) # 계산대 1~K\n",
"\n",
"next_idx = cnt # 다음 고객 index\n",
"\n",
"# K명 이후 고객 처리\n",
"while next_idx < N:\n",
" finish_time, counter, cid = heapq.heappop(pq)\n",
" exit_list.append((finish_time, -counter, cid))\n",
"\n",
" new_id, new_w = customers[next_idx]\n",
" heapq.heappush(pq, (finish_time + new_w, counter, new_id))\n",
" next_idx += 1\n",
"\n",
"# 계산대에 남은 고객 처리\n",
"while pq:\n",
" finish_time, counter, cid = heapq.heappop(pq)\n",
" exit_list.append((finish_time, -counter, cid))\n",
"\n",
"# 퇴장 규칙 정렬\n",
"exit_list.sort()\n",
"\n",
"# 정답 계산\n",
"ans = 0\n",
"for i, (_, _, cid) in enumerate(exit_list, start=1):\n",
" ans += i * cid\n",
"\n",
"print(ans)\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "ann_env",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.20"
}
},
"nbformat": 4,
"nbformat_minor": 5
}