순간을 성실히, 화려함보단 꾸준함을

[boj : 11565] 바이너리 게임 본문

알고리즘,SQL/백준,BOJ

[boj : 11565] 바이너리 게임

폭발토끼 2020. 12. 23. 17:09

www.acmicpc.net/problem/11565

 

11565번: 바이너리 게임

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

www.acmicpc.net

문제 : 문자열 a,b가 주어지고 a를 b로 만들 수 있는가?를 묻고 있음.

규칙 1 : 맨 앞문자를 지울 수 있음

규칙 2 : 맨 뒤에 문자를 추가할 수 있음. 이때 1이 홀수개이면 1을 나머지는 0을 추가

 

해설 : 와,,,이런문제 너무 싫어요....근데 또 재밌어 ㅋㅋㅋ(전형적으로 codeforces 에서 나올 법한 문제)

문제에 말리면 절대 풀 수 없는 문제.

결론부터 말하면 a와 b가 어떻게 생겨먹었든 전혀 상관 없다. 즉, '모양'과는 아무런 상관이 없다.

 

하나씩 생각해보면 1을 추가하려면 1이 홀수개가 존재야하고 추가를 하는 순간 짝수개가 된다. 그러면 맨앞의 문자들을 지워서 1을 다시 홀수개로 만들지 못한다면 0밖에 추가를 못한다.

 

이거를 다시 풀어보면 1을 추가할 수 있는 개수는 단 한개뿐! 이라는 것이다.

(종이에 적어보면서 하나씩 추가해보고 지워봐라)

 

저게 이해가 되면 문제는 쉽게 풀린다.

a문자열이 원래 홀수였다면 1을 1개 늘릴 수 있다.

a문자열이 원래 짝수였다면 1을 전혀 늘리지 못한다.

 

이걸 캐치했다면 코드로 옮기는 것만 남았다.

#include<bits/stdc++.h>

using namespace std;

int main()
{
	string x, y;
	cin >> x >> y;

	int a = 0, b = 0;
	for (int i = 0; i < x.length(); i++)
		if (x[i] == '1')a++;
	for (int j = 0; j < y.length(); j++)
		if (y[j] == '1')b++;
	a = (a + 1) / 2;
	b = (b + 1) / 2;
	cout << ((a >= b) ? "VICTORY" : "DEFEAT");
	return 0;
}

'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글

[boj : 15922] 아우으 우아으이야!!  (0) 2020.12.24
[boj : 15886] 내 선물을 받아줘2  (0) 2020.12.24
[boj : 12904] A와 B  (0) 2020.12.23
[boj : 13273] 로마숫자  (0) 2020.12.23
[boj : 4803] 트리  (0) 2020.12.22