[editorial] 2007년 서울 지역대회 인터넷 예선 I번 Random Game

  • JongMan
    JongMan

    [문제 보러 가기]
    "풀지 말라고 냈는데 두팀이나 풀었다" 라는 주최측의 커멘트에서도 알 수 있듯이 이 문제는 가장 풀기 어려웠던 문제 중
    하나입니다. 문제를 적절히 수학적으로 변환하고, 이 문제를 계산기하(computational geometry) 를 이용해 푸는
    풍부한 센스가 있어야 하는 문제죠.
    각 게임에 대한 사람별 만족도를 각각 벡터로
    나타냅시다. Si 는 i번째 게임에 대한 두 사람의 만족도를 포함하는 2차원 벡터라고 합시다. Ai 가 i번째 게임을 할
    확률이라고 하면, sum(i = 1 to n) Ai * Si 벡터는 각 사람이 마지막으로 느낄 총 만족도를 담는 벡터가 되겠지요.
    그러면, 이 문제는 계수(coefficient) 들의 합이 1인 Si 의 선형 결합(linear combination) 중, 최소 component 를 최대화하는 문제로 바뀝니다. 그런데 이 때 계수의 합이 1인 Si 의 선형 결합의 개수는 무한합니다. 따라서 각각을 하나씩 시도해볼 수는 없죠. 좀더 다른 식견, insight가 필요합니다.

    력 벡터들이 2차원이라는 점을 이용해서 이 벡터들을 시각화해 봅시다. 각 벡터들의 끝점을 2차원 평면 위에 찍어 보는 거죠. 이
    때, 우리가 구하는 선형 결합 결과 벡터의 끝 점들이 있을 수 있는 위치를 다 찍어 봅시다. 그러면, 실제로 이 점들은 입력
    벡터의 끝점들을 모두 포함하는 볼록 껍질(Convex hull) 안의 모든 점들이 된다는 것을 알 수 있어요. (사실 이와 같이, 계수들의 합이 1이 되는 선형 결합들을 특별히 볼록 결합Convex combination 이라고 부르기도 합니다)
    따라서, 입력 벡터에 주어진 점들을 모두 포함하는 볼록 껍질을 우선 계산한 뒤, 이 영역 안에 있는 점들 중 min(x, y) 를 최대화하는 점을 찾으면 이 문제를 풀 수 있습니다. 이를 풀기 위해 두 가지 방법이 있습니다:


  • 중 최소값을 최대화하는 문제라면, 우리가 찾는 점은 y = x 위에 있겠지요. y = x 직선을 그은 뒤 볼록 껍질이 이 직선과
    교차하는 점들 중에 답이 있을 것입니다. (단, 이 경우 볼록 껍질이 y = x 와 교차하지 않는다면 다른 답을 찾아야
    합니다.. 어떻게일까요? ^^)
  • 우리가 찾는 점은 볼록 껍질의 경계선 위에 있을 것입니다. (경계선 위에 있지
    않다면, y 나 x 중 하나나 둘 다를 증가시키는 방향으로 그 점을 밀어갈 수 있기 때문입니다) 따라서, 볼록 껍질을 이루는 각
    선분 위에 있는 점들 중에서 우리가 원하는 점을 찾으면 됩니다. 선형계획법(Linear programming) 문제를 해결하기 위한 심플렉스법(Simplex algorithm) 과 비슷하게 해결하셔도 되고, 각 선분 위에서 터너리 서치를 해도 되겠지요. 여기까지 오셨다면 이 문제가 어렵진 않으실 테니 이만.. :)

  • 실로 풀지 말라고 냈다는 말이 이해가 될 정도로 어려운 문제로군요. :) 푼 두 팀, 대단합니다!
    덧) 들리는 바로는 이 문제를 푼 두 팀 중 하나는 고등학교 팀이던 도전대학교(...) 팀이라는군요. 정말 대단하네요. 한국 CS 의 미래가 밝습니다~ :)

    • 구종만, algospot.com 운영진
    • 강지훈, algospot.com 멤버
      [이 글은 과거 홈페이지에서 이전된 글입니다. 원문보기]

    17년 전
3개의 댓글이 있습니다.
  • 세훈
    세훈

    정말 깔끔한 풀이네요
    저는 올해 대회에 참가하지는 않았지만 이 문제에 관심이 생겨서 오늘 좀 생각을 해봤는데요,
    풀이가 이런 식으로 될 줄은 상상도 못했습니다 :)
    다만 저는 기하가 아닌 다른 관점에서 풀었는데요, 생각해보면 위의 해답과 동치인 듯 하네요
    아마도 고등학교 팀이 이렇게 풀지 않았을 까...하는 관점에서 올려봅니다.
    (Ai, Bi는 i번째 게임에 대한 두 사람 A, B에 대한 만족도를 의미합니다.)
    먼저 제 솔루션에 대해 간략히 소개하면 이렇습니다.
    Ai >Bi인 모든 점 들 중 Bi가 Maximum인 점 Pi를 찾고,
    Aj < Bj인 모든 점 들 중 Aj가 Maximum인 점 Pj를 찾아 두 게임만 고려한 해를 찾는다. (간단한 방정식으로)
    Pi나 Pj 중 하나가 존재하지 않는다면, 그 게임만 선택한다
    저는 이 해가 위의 해와 동치라고 생각하는데요, 아래에 나름 그 이유를 작성해 보겠습니다.
    1. Convex hull
    --> Ai > Aj, Bi > Bj이면 게임 j는 무시된다.
    실제로 이 문제에서 컨벡스헐의 하반신은 솔루션이 될 수 없기 때문에 대수적으로 보면 저런 식과 Convex hull이
    동치이지 않나 싶습니다.
    2. 해는 경계선 위에 존재한다.
    --> 저는 이걸 솔루션은 최대 2개의 게임을 포함한다..라고 해석해보았습니다.
    제 솔루션 중 중요한 부분은
    Ai > Bi, Aj > Bj 일 때 Ai > Aj and Bi > Bj일 때만 게임 j가 무시되는 것이 아니라
    Ai < Aj and Bi > Bj이여도 게임 j가 무시된다고 생각을 한 것인데요,
    이건 x *Ai + y * Aj > x * Bi + y * Bj 이기 때문에
    한정된 x + y에서 x * Bi + y * Bj를 Maxmize하기 위해서는 x에 몰아주는것이 유리하기 때문이라고 생각했습니다.
    새로운 조건이 추가되면 사용가능한 게임이 딱 2개 아니면 1개로 줄게 됩니다.
    이건 결과적으로 해가 경계선 아니면 꼭지점에 있음을 암시하게 되지요.
    3. y=x와 교차점을 찾는다.
    --> 이건 뭐.. 어떻게 보면 당연한 거구요. 대수적으로도 비슷한 의미가 있죠 ^^;
    조금 더 설명을 하자면 y=x와 교차하는 선분은
    Ai>Bi인 점 중 Bi가 최대인 점 Pi와 Aj 예를 들어 Ai 항상 Ai>Bi인 점들 중 하나를 선택한다고 보면 Bi가 클수록 해가 증가하는 것을 확인 할 수 있습니다.
    그 반대도 마찬가지구요.
    4. 만약 교차하지 않는 다면, 해는 하나의 점이다.
    위에서는 터너리 서치가 나왔는데요... 아마도 제 생각엔 이런 경우 해는 하나의 점이 아닐까 싶습니다.
    왜냐면 교차하지 않는단 얘기는 y=x인 직선 위에 모든 점이 존재하거나 아래에 모든 점이 존재하는 경우인데요,
    만약 위에 모든 점이 존재한다면
    모든 점에 대해 Ai < Bi란 얘기고 이 경우 Ai가 max인 점을 선택하는 것이 Bi와 상관없이 유리하기 때문이지요.
    ... 비슷한가요?
    사무실에서 몰래 쓰다 보니 머리속이 정리가 잘 안되네요.
    게다가 금요일 저녁이라 ^^;;
    모두들 열공하시고 원하시는 성적 모두 내세요~


    17년 전 link
  • kcm1700
    kcm1700

    음.. 제가 알기로는 고교 팀도 기하로 변형해서 풀었습니다.
    고교팀이 한 방식은 convex hull을 직접 구하지 않고 코딩을 더 간결하게 하기 위하여 약간의 테크닉을 사용했습니다.
    고교팀의 방식을 정확히 적어보면
    먼저 k에 대해 바이너리 서치를 돌려줍니다.
    그 다음에 주어진 값들을 2차원 벡터로 표시하고
    거기서 거기에서 (k,k) 벡터를 뺍니다. 그런 후에 1사분면에 점이 있으면 무조건 가능하다고 하였고
    없다면 2사분면과 4사분면에 있는 벡터들을 하나씩 골랐을 때 사이각이 π이하가 되는 것이 있는지를 통해
    실제적으로 k에 대해 가능한지 불가능한지를 체크해보았습니다. 사이각이 파이 이하가 되면 가능한 것은
    생각해볼 수 있구요,
    음... 그리고 이 알고리즘을 생각해내기 전에
    Sum(A_i P_i) >= k
    Sum(B_i P_i) >= k
    라는 식을 세우고
    Sum(A_i P_i) >= k Sum (P_i)
    Sum(B_i P_i) >= k Sum (P_i)
    라고 한 뒤
    Sum( (A_i - K) P_i ) >= 0
    Sum( (B_i - K) P_i ) >= 0
    을 통해 벡터로 표현할 생각을 하였다고 하네요


    17년 전 link
  • kcm1700
    kcm1700

    혹시
    6,5
    100,4
    5,6
    4,100
    인 경우 세훈님이 제시하신 알고리즘에서 잘 작동하나요?
    제시한 알고리즘에서는 6,5랑 5,6을 선택하는 것 같은데 100,4와 4,100이 더 좋은 것 같습니다.


    17년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.