문제
https://www.acmicpc.net/problem/19583
19583번: 싸이버개강총회
첫번째 줄에는 개강총회를 시작한 시간 S, 개강총회를 끝낸 시간 E, 개강총회 스트리밍을 끝낸 시간 Q가 주어진다. (00:00 ≤ S < E < Q ≤ 23:59) 각 시간은 HH:MM의 형식으로 주어진다. 두번째 줄부터는
www.acmicpc.net
풀이
입력값의 범위가 10^5 이하였다. 이중 반복문을 이용한다면, 시간이 초과될 가능성이 있었다. 따라서, 데이터 탐색, 추가의 시간복잡도가 O(1)인 딕셔너리를 이용해 풀었다.
1. 입력값을 time, nickname으로 나누어 튜플의 형태로 data 배열에 담아준다. (이때 시간순으로 들어온다)
2. 만약 data 첫번째 원소의 time이 S보다 크다면, 0을 바로 반환해준다. 출석을 한 인원이 없다면, 뒤의 값을 확인할 필요도 없기 때문이다. S보다 크거나 작다는 가정에서 다음 과정을 진행한다.
3. for문으로 data를 순회하면서,
4. 만약 time이 S보다 작거나 같으면, 딕셔너리에 (닉네임 : 1) 값을 추가해준다.
5. 만약 time이 E보다 크거나 같고, 딕셔너리에서 해당 닉네임의 값이 1이면, 값을 0으로 바꿔주고, ans에 1을 더해준다.
6. ans를 출력한다.
코드
import Foundation
func solution() {
let input = readLine()!.components(separatedBy: " ")
let S = input[0], E = input[1], Q = input[2]
var data = [(time: String, nickname: String)](), dict = [String:Int](), ans = 0
while let chat = readLine() {
data.append((chat.components(separatedBy: " ")[0], chat.components(separatedBy: " ")[1]))
}
if let first = data.first, first.time > S {
print(0)
} else {
for chat in data {
if chat.time <= S {
dict[chat.nickname] = 1
} else if chat.time >= E && dict[chat.nickname] == 1 {
if chat.time <= Q {
dict[chat.nickname] = 0
ans += 1
}
}
}
print(ans)
}
}
'PS' 카테고리의 다른 글
[Leetcode - Swift] 111. Minimum Depth of Binary Tree (0) | 2023.02.01 |
---|---|
[Leetcode - Swift] 94. Binary Tree Inorder Traversal (0) | 2023.02.01 |
[백준 - Swift] 4358 생태학 (0) | 2023.01.20 |
[백준 - Swift] 10799 쇠막대기 (0) | 2023.01.19 |
[백준 - Swift] 1874 스택 수열 (0) | 2023.01.19 |