문제 - 탑코더 바이너리 플립
A장의 0과 B장의 1이 주어지는 게임이 있습니다. 여러분의 목표는 모든 것을 1로 바꾸는 것입니다.
턴마다 정확히 K장의 숫자를 선택하고 숫자를 반전합니다 (0은 1로 바귀고, 1은 0으로 바꿉니다).
현재 값에 상관없으며 이미 반전한 숫자도 원하는 대로 턴마다 선택할 수 있습니다.
게임에서 이기기 위한 최소 턴 수를 리턴하세요. 게임에서 이기는 것이 불가능 하다면 -1을 리턴하세요.
//////////////////////////////////////
코드
///////////////////////////////////
책에 나온 코드 설명
i번째 턴에서 모든 카드를 1로 만들 수 있다고 가정하면 카드를 뒤집는 횟수는 다음과 같습니다
i x K번
또한 원래 0이었던 것이 A장 있으므로 A장은 반드시 뒤집어야 합니다.
나머지를 뒤집는 횟수를 rest라고 하면 rest는 다음과 같이 구할 수 있습니다.
rest= i x K - A장
이 나머지 rest가 같은 카드를 2번 뒤집는 조작을 몇 번 반복할지가 됩니다.
조작이 가능한 횟수는 다음과 같습니다.
원래 카드가 0일 때는 (i-1)/2 번
원래 카드가 1일 때는 i/2 번
이유는 간단합니다. 0의 카드는 반드시 최초에 한 번 뒤집어야 합니다.
반면 1의 카드는 처음부터 1이므로 처음부터 이유 없이 뒤집을 수 있는 횟수를 use라고 하면 다음가 같이 표현할 수 있습니다.
use = ((i/2) x B + ((i-1)/2) x A ) x 2
지금까지 계산한 rest와 use를 이용하면 다음과 같은 조건을 얻을 수 있습니다.
1. A 장 이상 뒤집을 수 있어야 합니다 rest >= 0 -> i x K >= A
2. 뒤집는 수의 홀수 짝수가 일치해야 합니다. rest %2 = 0 <- 뭔 개소리?
3. 이유없이 뒤집을 수 있는 조작이 충분해야 합니다. rest <= use <- 이것도 뭔 개소리?
이러한 3가지 조건이 충족되면 가정에 모순되지 않게 i번째 턴에서 모든 카드를 1로 만드는 것이 가능합니다.
///////////////
2, 3번 조건이 도대체 뭔소린지 이해가 안가요.
직접 동전 뒤집어 보면 뭔소린지 알텐데
ㅋㅋㅋㅋㅋㅋ 아 넘나 어려워
아 아직도 먼소린지 이해안감. 동전 뒤집어봐도 몰라요 누가 설명좀 해줘 제발
위에 답변있다 봐라