๐ ๋ฌธ์
https://www.acmicpc.net/problem/11723
๐ ๋ฌธ์ ์์ฝ
๋น์ด์๋ ๊ณต์งํฉ S๊ฐ ์ฃผ์ด์ก์ ๋, ์๋ ์ฐ์ฐ์ ์ํํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
add x: S์ x๋ฅผ ์ถ๊ฐํ๋ค. (1 โค x โค 20) S์ x๊ฐ ์ด๋ฏธ ์๋ ๊ฒฝ์ฐ์๋ ์ฐ์ฐ์ ๋ฌด์ํ๋ค.
remove x: S์์ x๋ฅผ ์ ๊ฑฐํ๋ค. (1 โค x โค 20) S์ x๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ฐ์ฐ์ ๋ฌด์ํ๋ค.
check x: S์ x๊ฐ ์์ผ๋ฉด 1์, ์์ผ๋ฉด 0์ ์ถ๋ ฅํ๋ค. (1 โค x โค 20)
toggle x: S์ x๊ฐ ์์ผ๋ฉด x๋ฅผ ์ ๊ฑฐํ๊ณ , ์์ผ๋ฉด x๋ฅผ ์ถ๊ฐํ๋ค. (1 โค x โค 20)
all: S๋ฅผ {1, 2, โฆ, 20} ์ผ๋ก ๋ฐ๊พผ๋ค.
empty: S๋ฅผ ๊ณต์งํฉ์ผ๋ก ๋ฐ๊พผ๋ค.์ ๋ ฅ: ์ฒซ์งธ ์ค์ ์ํํด์ผ ํ๋ ์ฐ์ฐ์ ์ M (1 โค M โค 3,000,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์ ์ํํด์ผ ํ๋ ์ฐ์ฐ์ด ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ: check ์ฐ์ฐ์ด ์ฃผ์ด์ง๋๋ง๋ค, ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
๐ก ์ ๊ทผ ๋ฐฉ๋ฒ
๋ฉ๋ชจ๋ฆฌ๊ฐ ์๊ฒ ๊ฑธ๋ ค ์๊ธฐ์ ์ด๋ป๊ฒ ํ์ด๋๊ฐ์ผ ํ ์ง ๊ณ ๋ฏผ์ ํ๋ค.
์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐ๋ฉด์ ์๊ฐ์๋ ๊ฑธ๋ฆฌ์ง ์์ผ๋ ค๋ฉด set ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ค.
๋ฌธ์ ๋ฅผ ํ๋ฉฐ ์๊ฒ๋ ์ฌ์ค์ set๊ณผ unordered_set์ insert, erase ์๊ฐ ๋ณต์ก๋๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ ์๊ฒ ๋๋ค.
set์ unordered_set์ผ๋ก ๋ณ๊ฒฝํ์ฌ ๋ฌธ์ ๋ฅผ ์งํ ํ๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก๋ ํ๊ฒ๋ ๋ฌธ์ ์ธ๋ฐ
๋ค๋ฅธ ํด๋ต์ ๋ณด๋ ๋นํธ๋ง์คํน์ ํ์ฉํด ํธ๋ ๋ฐฉ๋ฒ์ด ๋ง์ ๊ฒ ๊ฐ๋ค.
โ ๏ธ ์ฒ์์ ํ๋ ์ค์
๐ป ์ฝ๋
#include <iostream>
#include <string>
#include <unordered_set>
using namespace std;
int M;
unordered_set<int> S;
string command;
int value;
void commandStr() {
bool isContained = S.find(value) != S.end();
if (command == "add" && !isContained)
S.emplace(value);
else if (command == "remove" && isContained)
S.erase(value);
else if (command == "check") {
if (isContained)
cout << '1' << '\n';
else
cout << '0' << '\n';
} else if (command == "toggle") {
if (isContained)
S.erase(value);
else
S.emplace(value);
}
}
void commandAll() {
S = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
}
void commandEmpty() { S = {}; }
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> M;
for (int i = 0; i < M; ++i) {
cin >> command;
if (command == "all") {
commandAll();
} else if (command == "empty") {
commandEmpty();
} else {
cin >> value;
commandStr();
}
}
return 0;
}