※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 23257번 문제인 비트코인은 신이고 나는 무적이다이다.
문제는 아래 링크를 확인하자.

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

 

23257번: 비트코인은 신이고 나는 무적이다

코인 경력 4년차, 차트에 통달한 찬호는 이전 $N$개의 월봉을 통해 다음 월봉의 절댓값을 예측할 수 있는 아래의 공식을 만들어냈다. (다음 월봉의 절댓값) = 이전 $N$개의 월봉 중 중복을 허용해

www.acmicpc.net

주어지는 수의 절댓값의 범위가 0 이상 1023 이하임을 확인하자.

 

이를 이용하여 수 m개를 xor해 만들 수 있는 각 수 X에 N가지 수를 각각 xor해보는 것으로 수 m+1개를 xor해 만들 수 있는 수들의 목록을 구해낼 수 있다.

 

이 과정은 최악의 경우 X 1023가지에 N가지 수를 xor해보는 약 100만회의 연산이 단계당 필요하다.

 

이 과정은 가벼운 비트연산 위주로 구성되어있으므로 이를 반복하는 것으로 충분히 제한시간 내에 문제를 해결할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int M, N;
int num[100];
bool arr[101][1024];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> M;
	for (int i = 0; i < N; i++) {
		int& x = num[i]; cin >> x;
		x = abs(x);
		arr[1][x] = 1;
	}
	for (int m = 1; m < M; m++) {
		for (int i = 0; i < 1024; i++) {
			if (arr[m][i]) {
				for (int k = 0; k < N; k++) {
					arr[m + 1][i ^ num[k]] = 1;
				}
			}
		}
	}

	for (int i = 1023; i > -1; i--) {
		if (arr[M][i]) {
			cout << i;
			return 0;
		}
	}
}
728x90

+ Recent posts