왕자와 용 알고리즘 문제
심심풀이로 왕자와 용 알고리즘 문제를 풀고 있는데 도저히 해결법이 떠오르지 않아 이렇게 도움을 청합니다.
문제는 이렇습니다. 용의 머리는 n 개입니다. 왕자는 마법검을 두개 가지고 있는데 하나는 c1개의 용 머리를 또 다른 하나는 c2개의 용 머리를 자를 수 있습니다.
두개의 마법검으로 용 머리를 모두 자르면 왕자가 승리합니다. 단 용머리를 마법검으로 잘랐는데 모든 머리를 자르지 못 하면 c1 마법검을 썼을 경우 g1, c2 마법검을 썼을 경우 g2 개만큼의 머리가 다시 생겨납니다.
마법검은 자를 머리의 개수가 모자라지 않을 경우에만 사용 할 수 있습니다. 만약 남은 용의 머리 개수가 c1 - 1 이거나 c2 - 1인 경우 왕자는 자신의 머리를 포함해서 마법검을 사용 할 수 있고, 이 경우 승패는 비깁니다.
대략적으로 손쉬운 경우의 수는 해결방법을 찾을 수 있었습니다.
제가 막힌 부분은 하나의 마법검을 사용하면 용 머리 갯수가 늘어나고 또 다른 하나의 마법검을 사용하면 용 머리 갯수가 줄어드는 경우입니다.
이걸 수식으로 다시 풀면 이렇게 될 듯 합니다.
n - c1 = a * (c1 - g1) + b (c2 - g2)
또는
n - c2 = a * (c1 - g1) + b (c2 - g2)
이 식을 만족하는 정수 a, b 가 존재하는지를 적절한 시간내에 알아낼 수 있다면 문제를 풀 수 있을 것 같은데 뽀죡한 해결 방법이 떠오르지 않습니다.
참고로 이 경우 c1 - g1 의 값과 c2 - g2 의 값의 부호는 반대입니다. 하나는 양수, 하나는 음수입니다.
혹시 제가 방향 자체를 잘 못 잡은 것일 수도 있을 듯 한데 그렇다면 다른 해결 방향을 제시 해주셔도 감사하겠습니다.
단순화시키면, 방정식 ax+by=c 에서 a, b,
단순화시키면, 방정식 ax+by=c 에서 a, b, c가 모두 정수인 경우 x, y가 정수인 해를 찾는 거네요.
이런 유형의 문제라고 한다면, 고등학교 산수 문제인것 같다는 생각이 드는데요...
피할 수 있을때 즐겨라! http://melotopia.net/b
유클리드 알고리즘
확장된 유클리드 알고리즘으로 풀 수 있습니다.
http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm
Linear Diophantine Equation 을
Linear Diophantine Equation 을 검색해보세요..
이걸 이해할려면 Extended Euclid 부터 이해해야겠네요..
WHAT'S UP
답변 주신 분들께 감사드립니다.
수학이 부족하다 보니 해결방법을 찾지 못 했는데 역시 수학적으로 풀 수 있는 방법이 있었군요.
답변이 큰 도움이 되었습니다. 감사합니다.
PS> 정수론을 좀 공부 해둬야겠다는 생각이 문득 드네요. ^_^;;
--
Minimalist Programmer
관건은 ax+by=c 를 만족하는 "0 혹은 양의
관건은 ax+by=c 를 만족하는 "0 혹은 양의 정수인" x, y가 존재하냐 인것 같습니다.
양의 정수 조건만 없으면 간단할 것 같은데요...
그럼 부호에 상관 없이 다 찾은 다음에 음의 정수인
그럼 부호에 상관 없이 다 찾은 다음에 음의 정수인 경우를 제외하면 되죠.
피할 수 있을때 즐겨라! http://melotopia.net/b
해의 개수가 무한대니 애초에 다 찾는다는 것 자체가
해의 개수가 무한대니 애초에 다 찾는다는 것 자체가 불가능하죠.
양의 정수 조건을 빼면 c 가 gcd(a, b) 의
양의 정수 조건을 빼면 c 가 gcd(a, b) 의 배수인 경우 답의 개수는 무한대입니다..
별로 간단해보이지 않네요..
WHAT'S UP
말씀하신대로 c가 gcd(a,b)의 배수이면 답의
말씀하신대로 c가 gcd(a,b)의 배수이면 답의 개수는 무한대이죠.
그런데 애초에 문제의 핵심이 "해가 존재하냐 하지 않느냐"이기 때문에 이러한 경우 "해가 존재한다"로 답이 나온거죠.
흠...
문제 출처라도 적어주시면 좋았겠습니다.
http://ipsc.ksp.sk/archive.php
IPSC 2010년도 문제 Dragon slayer 입니다.
댓글 달기