Skip to content

Commit 0868d61

Browse files
committed
[Gold II] Title: 부품 대여장, Time: 468 ms, Memory: 85396 KB -BaekjoonHub
1 parent c04c8c8 commit 0868d61

2 files changed

Lines changed: 146 additions & 0 deletions

File tree

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# [Gold II] 부품 대여장 - 21942
2+
3+
[문제 링크](https://www.acmicpc.net/problem/21942)
4+
5+
### 성능 요약
6+
7+
메모리: 85396 KB, 시간: 468 ms
8+
9+
### 분류
10+
11+
구현, 자료 구조, 문자열, 집합과 맵, 해시를 사용한 집합과 맵, 파싱
12+
13+
### 제출 일자
14+
15+
2025년 11월 26일 19:42:32
16+
17+
### 문제 설명
18+
19+
<p>송훈이는 로봇 동아리 회원이다. 로봇 동아리에서 필요한 부품이 있을 경우 자유롭게 빌려서 쓰고 다시 돌려놓으면 된다.</p>
20+
21+
<p>하지만 부품 정리를 하다가 부품 관리가 너무 힘들어져 새로운 시스템을 도입하려고 한다.</p>
22+
23+
<p>부품을 빌려갈 경우 <strong>부품 대여장</strong>에 정보를 반드시 작성해야한다. 또한 빌려간 부품을 반납 할 경우에도 <strong>부품 대여장</strong>에 정보를 작성해야한다.</p>
24+
25+
<p>또한 대여기간을 정하고 대여기간을 넘길 경우 1분당 벌금을 부여하도록 하는 시스템이다.</p>
26+
27+
<p>만약 대여기간이 5분, 1분당 벌금이 5원이라 했을 때 대여한 시각이 <strong>2021년 1월 1일 1시 5분</strong>이라면 <strong>2021년 1월 1일 1시 10분까지</strong> 반납해야한다.</p>
28+
29+
<p><strong>2021년 1월 1일 1시 14분</strong>에 반납을 했다면 4분 늦었기 때문에 벌금을 20원을 내야한다.</p>
30+
31+
<p>부품 대여장에 쓰는 형식은 아래와 같다.</p>
32+
33+
<pre>yyyy-MM-dd hh:mm [부품 이름] [동아리 회원 닉네임]</pre>
34+
35+
<p>아래는 예시를 위한 부품 대여장에 작성된 정보이다. 대여기간이 5분, 벌금은 1원이라 가정하자.</p>
36+
37+
<pre>2021-01-01 09:12 arduino tony9402
38+
2021-01-01 09:13 monitor chansol
39+
2021-01-01 09:18 arduino tony9402
40+
2021-01-01 09:18 monitor chansol</pre>
41+
42+
<p>위의 정보를 정리하면 아래와 같다.</p>
43+
44+
<pre>tony9402가 2021년 1월 1일 오전 9시 12분에 arduino를 빌렸다.
45+
chansol이 2021년 1월 1일 오전 9시 13분에 monitor를 빌렸다.
46+
tony9402가 2021년 1월 1일 오전 9시 18분에 arduino를 반납했다.
47+
chansol이 2021년 1월 1일 오전 9시 18분에 monitor를 반납했다.</pre>
48+
49+
<p>tony9402는 1분 늦게 반납했기 때문에 벌금 1원을 내야한다.</p>
50+
51+
<p>부품을 대여할 때 지켜야 하는 조건이 있다.</p>
52+
53+
<ol>
54+
<li>한 사람이 같은 종류의 부품을 두개 이상 대여하고 있는 상태일 수 없다.</li>
55+
<li>한 사람이 같은 시각에 서로 다른 종류의 부품들을 대여하는 것이 가능하다.</li>
56+
<li>같은 사람이더라도, 대여 기간은 부품마다 별도로 적용된다.</li>
57+
</ol>
58+
59+
### 입력
60+
61+
<p>첫 번째 줄에 부품 대여장에 작성된 정보의 개수 $N$, 대여기간 $L$, 벌금 $F$이 공백으로 구분되어 주어진다.</p>
62+
63+
<p>대여기간 형식은 <code>DDD/hh:mm</code>으로 <code>DDD</code>는 일, <code>hh</code>는 시간, <code>mm</code>은 분을 의미한다. (<code>000/00:00</code> 는 주어지지 않는다.)</p>
64+
65+
<p>두 번째 줄부터 $N + 1$번째 줄까지 <strong>시간순</strong>으로 부품 대여장에 작성한 정보 (시각, 부품 이름 $P$, 회원 닉네임 $M$)이 공백으로 구분되어 주어진다.</p>
66+
67+
<p>빌린 시각의 형식은 <code>yyyy-MM-dd hh:mm</code>으로 <code>yyyy</code>는 연도, <code>MM</code>는 월, <code>dd</code>는 일, <code>hh</code>는 시간, <code>mm</code>는 분을 의미한다. 이 문제에서 들어오는 연도는 항상 2021년도이다.</p>
68+
69+
<p>부품 이름 $P$는 알파벳 소문자로만 이루어져 있다. 즉, 부품 이름에 공백이 없다.</p>
70+
71+
<p>회원 닉네임 $M$은 알파벳 소문자와 숫자$(0$ ~ $9)$로만 이루어져있다. 즉, 회원 닉네임에 공백이 없다.</p>
72+
73+
### 출력
74+
75+
<p>벌금을 내야하는 사람들을 <strong>사전순</strong>으로 동아리 회원 닉네임 $M$와 내야하는 벌금을 한 줄씩 출력한다.</p>
76+
77+
<p>만약 벌금을 내야하는 사람들이 없는 경우는 -1을 출력한다.</p>
78+
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import Foundation
2+
3+
func toMinutes(_ dateStr: String, _ timeStr: String) -> Int {
4+
let ds = dateStr.split(separator: "-").map { Int($0)! }
5+
let ts = timeStr.split(separator: ":").map { Int($0)! }
6+
let year = ds[0]
7+
let month = ds[1]
8+
let day = ds[2]
9+
let hour = ts[0]
10+
let minute = ts[1]
11+
12+
let monthDays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
13+
var totalDays = 0
14+
for m in 1..<month {
15+
totalDays += monthDays[m]
16+
}
17+
totalDays += (day - 1)
18+
let totalMinutes = totalDays * 24 * 60 + hour * 60 + minute
19+
return totalMinutes
20+
}
21+
22+
let line = readLine()!.split(separator: " ")
23+
let N = Int(line[0])!
24+
let Lstr = String(line[1])
25+
let F = Int(line[2])!
26+
27+
// Lstr = "DDD/HH:MM"
28+
let parts = Lstr.split(separator: "/")
29+
let d = Int(parts[0])!
30+
let hm = parts[1].split(separator: ":")
31+
let hh = Int(hm[0])!
32+
let mm = Int(hm[1])!
33+
let allowedMinutes = d * 24 * 60 + hh * 60 + mm
34+
35+
var rentRecord = [String: Int]()
36+
37+
var fines = [String: Int]()
38+
39+
for _ in 0..<N {
40+
let entry = readLine()!.split(separator: " ")
41+
let dateStr = String(entry[0])
42+
let timeStr = String(entry[1])
43+
let item = String(entry[2])
44+
let name = String(entry[3])
45+
let key = item + " " + name
46+
let now = toMinutes(dateStr, timeStr)
47+
48+
if let start = rentRecord[key] {
49+
// 반납
50+
let diff = now - start
51+
if diff > allowedMinutes {
52+
let late = diff - allowedMinutes
53+
fines[name, default: 0] += late * F
54+
}
55+
rentRecord.removeValue(forKey: key)
56+
} else {
57+
// 대여
58+
rentRecord[key] = now
59+
}
60+
}
61+
62+
if fines.isEmpty {
63+
print("-1")
64+
} else {
65+
for name in fines.keys.sorted() {
66+
print(name, fines[name]!)
67+
}
68+
}

0 commit comments

Comments
 (0)