[백준 27622] Suspicious Event (C#, C++) - soo:bak
작성일 :
문제 링크
설명
로그인과 로그아웃 기록이 시간 순서대로 주어질 때, 이전에 로그인한 적이 없는 사용자의 로그아웃 횟수를 세는 문제입니다.
접근법
현재 로그인되어 있는 사용자만 집합에 저장하며 기록을 앞에서부터 순서대로 처리합니다.
양수 x가 나오면 사용자 x가 로그인한 것이므로 집합에 넣습니다. 음수 -x가 나오면 사용자 x의 로그아웃인데, 이 사용자가 집합에 없으면 수상한 이벤트입니다. 반대로 집합에 있으면 정상 로그아웃이므로 집합에서 제거합니다.
모든 기록에 대해 이 과정을 반복하면서 수상한 로그아웃만 세면 됩니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
using System.Collections.Generic;
using System.Linq;
class Program {
static void Main() {
int n = int.Parse(Console.ReadLine()!);
int[] events = Console.ReadLine()!.Split().Select(int.Parse).ToArray();
var loggedIn = new HashSet<int>();
int answer = 0;
foreach (int ev in events) {
if (ev > 0) {
loggedIn.Add(ev);
} else {
int user = -ev;
if (loggedIn.Contains(user))
loggedIn.Remove(user);
else
answer++;
}
}
Console.WriteLine(answer);
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
unordered_set<int> logged_in;
int answer = 0;
for (int i = 0; i < n; i++) {
int ev;
cin >> ev;
if (ev > 0) {
logged_in.insert(ev);
} else {
int user = -ev;
if (logged_in.find(user) != logged_in.end())
logged_in.erase(user);
else
answer++;
}
}
cout << answer << "\n";
return 0;
}