problem solving

백준 11565: 바이너리 게임

finding wangdo 2023. 2. 24. 20:42

 

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

 

11565번: 바이너리 게임

첫 번째 줄에는 문자열 a, 두 번째 줄에는 문자열 b가 주어진다. 두 문자열은 0과 1로만 이루어져 있으며, 문자열 a와 문자열 b의 길이는 1 이상 1,000 이하이다.

www.acmicpc.net

 

 

문자열 a에서 1의 개수를 ca라고 하고 문자열 b에서 1의 개수를 cb라고 하자.

 

ca가 홀수인 경우 parity(a)가 1이기 때문에 문자열 끝에 1을 추가할 수 있다.

그러면 parity(a)가 0이 된다. 이러면 문자열 끝에 0을 맘껏 추가할 수 있다.

문자열 앞에서부터 1을 지울 때까지 숫자를 계속 지우면 parity(a)가 1이 된다. 그러면 또 문자열 끝에 1을 추가할 수 있다.

다만, 어떻게 해도 만든 문자열에서 1의 개수가 ca+1보다 커질 수는 없다.

 

그래서 일단 cb>ca+1인 경우는 무조건 DEFEAT이다.

반면 cb<=ca+1인 경우는 무조건 VICTORY이다. 아까 그 과정을 거치면 어떤 문자열이든 만들 수 있기 때문이다.

 

ca가 짝수인 경우도 마찬가지다.

이땐 문자열 끝에 parity(a), 즉 0을 맘껏 추가하거나

문자열 앞에서부터 1을 지울 때까지 숫자를 계속 지워서 parity(a)를 1로 만든 뒤 문자열 끝에 1을 추가하는 식으로

ca>=cb이기만 한다면 b를 완성시키는 것이 무조건 가능하다.

반대로 ca<cb이면 무조건 DEFEAT이다.

 

C언어로 구현한 것:

#include<string.h>

int main()
{
	char a[1004];
	char b[1004];
	scanf("%s", a);
	scanf("%s", b);
	int ca = 0;
	int cb = 0;
	for (int i = 0;i < strlen(a);i++)
	{
		if (a[i] == '1')
			ca++;
	}
	for (int i = 0;i < strlen(b);i++)
	{
		if (b[i] == '1')
			cb++;
	}

	if (ca % 2 == 0)
	{
		if (ca >= cb)
			printf("VICTORY");
		else
			printf("DEFEAT");
		return 0;
	}
	else
	{
		if (ca >= cb - 1)
			printf("VICTORY");
		else
			printf("DEFEAT");
		return 0;
	}

}

 

'problem solving' 카테고리의 다른 글

백준 15011: Irrational Division  (1) 2023.03.01
백준 4342: 유클리드 게임  (0) 2023.02.28
백준 3015: 오아시스 재결합  (1) 2023.02.24
백준 3358: Tower of coins  (0) 2023.02.24
백준 16888: 루트 게임  (0) 2023.02.24