[백준 15787번 C/C++] 기차가 어둠을 헤치고 은하수를

 

 

https://www.acmicpc.net/problem/15787


 

 

해결전략

 

비트마스킹 BitMasking


 

 

정답코드

 

#include <iostream>
#include <vector>
#include <set>
using namespace std;
int n, m; // n: 기차의 수, m: 명령의 수
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> m;
vector<int> v(n, 0);
for (int i = 0; i < m; i++)
{
int orderIdx, train, x;
cin >> orderIdx >> train;
train--; // 0-based index로 변환
if (orderIdx == 1 || orderIdx == 2) {
cin >> x;
x--; // 0-based index로 변환
// x 값이 0~19 범위를 벗어날 수 없도록 제한
if (x < 0 || x > 19) continue;
}
if (orderIdx == 1) {
v[train] |= (1 << x);
}
else if (orderIdx == 2) {
v[train] &= ~(1 << x);
}
else if (orderIdx == 3) {
v[train] <<= 1;
v[train] &= ((1 << 20) - 1); // 상위 20번째 비트를 넘지 않도록 제한
}
else if (orderIdx == 4) {
v[train] >>= 1;
}
}
set<int> mySet;
for (int i = 0; i < v.size(); i++){
mySet.insert(v[i]);
}
cout << mySet.size() << "\n";
return 0;
}