왕자와 용 알고리즘 문제

sangheon의 이미지

심심풀이로 왕자와 용 알고리즘 문제를 풀고 있는데 도저히 해결법이 떠오르지 않아 이렇게 도움을 청합니다.

문제는 이렇습니다. 용의 머리는 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 의 값의 부호는 반대입니다. 하나는 양수, 하나는 음수입니다.

혹시 제가 방향 자체를 잘 못 잡은 것일 수도 있을 듯 한데 그렇다면 다른 해결 방향을 제시 해주셔도 감사하겠습니다.

snowall의 이미지

단순화시키면, 방정식 ax+by=c 에서 a, b, c가 모두 정수인 경우 x, y가 정수인 해를 찾는 거네요.

이런 유형의 문제라고 한다면, 고등학교 산수 문제인것 같다는 생각이 드는데요...

피할 수 있을때 즐겨라! http://melotopia.net/b

feanor의 이미지

확장된 유클리드 알고리즘으로 풀 수 있습니다.
http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm

helloneo의 이미지

Linear Diophantine Equation 을 검색해보세요..
이걸 이해할려면 Extended Euclid 부터 이해해야겠네요..

WHAT'S UP

sangheon의 이미지

수학이 부족하다 보니 해결방법을 찾지 못 했는데 역시 수학적으로 풀 수 있는 방법이 있었군요.

답변이 큰 도움이 되었습니다. 감사합니다.

PS> 정수론을 좀 공부 해둬야겠다는 생각이 문득 드네요. ^_^;;

--

Minimalist Programmer

sliver의 이미지

관건은 ax+by=c 를 만족하는 "0 혹은 양의 정수인" x, y가 존재하냐 인것 같습니다.
양의 정수 조건만 없으면 간단할 것 같은데요...

snowall의 이미지

그럼 부호에 상관 없이 다 찾은 다음에 음의 정수인 경우를 제외하면 되죠.

피할 수 있을때 즐겨라! http://melotopia.net/b

sliver의 이미지

해의 개수가 무한대니 애초에 다 찾는다는 것 자체가 불가능하죠.

helloneo의 이미지

양의 정수 조건을 빼면 c 가 gcd(a, b) 의 배수인 경우 답의 개수는 무한대입니다..
별로 간단해보이지 않네요..

WHAT'S UP

sliver의 이미지

말씀하신대로 c가 gcd(a,b)의 배수이면 답의 개수는 무한대이죠.
그런데 애초에 문제의 핵심이 "해가 존재하냐 하지 않느냐"이기 때문에 이러한 경우 "해가 존재한다"로 답이 나온거죠.

kalevala의 이미지

문제 출처라도 적어주시면 좋았겠습니다.

http://ipsc.ksp.sk/archive.php

IPSC 2010년도 문제 Dragon slayer 입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.