본문 바로가기
IT/BOJ

백준(BOJ) 15787 기차가 어둠을 헤치고 은하수를 **

by 빨강자몽 2018. 6. 2.

# 비트연산


이 문제의 경우 비트연산을 이해하고 사용할 줄 안다면 쉽게 풀 수 있는 문제이다.

푸는 과정에서 3, 4명령어의 이동 방향을 잘 못 생각하여 실수를 하였다.



#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <math.h>
#include <queue>
#include <set>
#include <list>
#include <utility>
#include <functional>
#define MAX 100005
#define INF 987654321
#define MOD 1000000009
#pragma warning(disable:4996)
using namespace std;
typedef long long ll;
typedef pair<int, int> pi;
typedef pair<pi, pi> ppi;

int n, m,train[MAX],a,b,c,ans=0;
bool visit[(1 << 20) - 1];

int main()
{
	scanf("%d%d", &n, &m);
	for (int i = 0; i < m; i++)
	{
		scanf("%d%d", &a, &b);
		if (a == 1 || a == 2)
			scanf("%d", &c);
		if (a == 1)
			train[b] |= 1 << (c - 1);
		else if (a == 2)
			train[b] &= ((1 << 20) - 1) - (1 << (c - 1));
		// 3, 4의 명령어의 경우 이동의 방향에 대해서 생각해 봐야한다.
		// 여기서 실수를 했다.
		else if (a == 3)
			train[b] = train[b] * 2 & ((1 << 20) - 1);
		else if (a == 4)
			train[b] /= 2;
	}
	
	for(int i=1;i<=n;i++)
	// 풀이 할 때 0명이 탑승한 것도 계산해야한다.
		if (visit[train[i]] == false)
		{
			ans++;
			visit[train[i]] = true;
		}
	printf("%d", ans);
	return 0;
}


'IT > BOJ' 카테고리의 다른 글

백준(BOJ) 15791 세진이의 미팅 **  (0) 2018.06.05
백준(BOJ) 14621 나만 안되는 연애 **  (0) 2018.06.03
백준(BOJ) 11726 2*n 타일링 **  (0) 2018.06.01
백준(BOJ) 11084 나이트의 염탐 **  (0) 2018.06.01
백준(BOJ) 2449 전구 ***  (0) 2018.06.01