Farkle은 확률과 위험을 감수하는 재미있는 주사위 게임이에요. 플레이어들은 여섯 개의 주사위를 굴리고 일부 주사위를 점수로 남겨두며, 나머지 주사위를 계속 굴려 더 많은 점수를 얻을지 아니면 현재까지 얻은 점수를 확정하고 자신의 차례를 마칠지 결정해야 해요.
Farkle을 플레이하는 최적 전략을 찾고 싶었어요. 내 친구들을 더 자주 이기게 해줄 재미있는 문제였거든요. 최적 전략을 찾는 과정과 이를 실제 게임에 어떻게 활용할 수 있는지 알려드릴게요.
Farkle 규칙
Farkle의 전체 설명은 위키피디아 페이지를 읽어보세요. 또는 게임에 대한 간단한 설명을 계속 읽어도 돼요. 변형이 있지만, 저는 이 규칙으로 게임을 플레이해요.
턴을 시작할 때 여섯 개의 주사위를 모두 굴립니다. 일부 주사위를 선택하여 점수를 획들할 수 있어요.
- 어떤 한 개의 1은 100 포인트가 값어치가 있습니다.
- 어떤 한 개의 5는 50 포인트가 값어치가 있습니다.
- 같은 숫자 세 개는 주사위의 값의 100배가 값어치가 됩니다. 따라서 세 개의 2는 200, 세 개의 3은 300, 세 개의 6은 600입니다. 예외로 세 개의 1은 1000 포인트가 값어치가 있습니다.
- 같은 숫자 네 개는 같은 숫자 세 개의 두 배가 값어치가 됩니다. 따라서 네 개의 2는 400입니다. 같은 숫자 다섯 개는 그 두 배(다섯 개의 2는 800)이며, 같은 숫자 여섯 개는 그 두 배(여섯 개의 2는 1600)입니다.
- 모든 여섯 개의 주사위에 대한 직선(1, 2, 3, 4, 5, 6)은 1500 포인트가 값어치가 있습니다.
- 세 쌍(예: 2, 2, 3, 3, 5, 5)은 1500 포인트가 값어치가 있습니다.
포인트를 얻기 위해 주사위를 보관한 후, 나머지 주사위를 굴려 턴에 추가 포인트를 더할 수 있거나 턴을 종료하고 모은 포인트를 가져갈 수 있습니다. 언제든지 굴리고 아무 주사위도 보관하지 못하면 해당 턴에 대한 모든 포인트를 잃게 됩니다. 이를 '파클(Farkle)'이라고 합니다.
모든 점수 주사위를 보관할 필요는 없습니다. 예를 들어, 1, 1, 4, 5, 6, 6을 굴려서 1, 1, 5를 250 포인트로 보관하고 다른 세 개의 주사위를 굴릴 수도 있고, 하나의 1만 100 포인트로 보관하고 나머지 다섯 개의 주사위를 굴릴 수도 있습니다. 이러한 경우 더 유익할 수도 있습니다.
한 번 굴린 주사위를 보관해서 이전 굴림에서의 주사위들과 결합할 수 없습니다. 두 개의 1을 보관하고 다시 굴려서 다른 1을 보관한다면, 각각이 100 포인트만 값어치가 됩니다. 세 개의 동일한 숫자 세트를 만들기 위해 이를 결합할 수 없습니다.
만약 여섯 개의 주사위를 모두 보관하여 굴릴 주사위가 남지 않은 경우, 여섯 개의 주사위를 다시 굴려 해당 턴의 점수를 계속해서 늘릴 수 있습니다.
전략
어떤 굴림 후에, 두 가지 결정을 해야 합니다: 1) 어떤 주사위를 보관할 것인지, 2) 계속해서 굴리거나 턴을 끝내고 점수를 획득할 것인지 결정하는 것입니다. 때로는 결정하기 쉽습니다. 예를 들어, 1, 3, 6, 6, 6, 6이 굴렸을 때, 1과 6 네 개를 보관하여 1300 점을 획득하고 턴을 끝내게 됩니다. 남은 하나의 주사위를 굴리는 것은 Farkle이 될 가능성이 2/3이며, 1300 점을 잃게 되므로 이때에는 턴을 끝내는 것이 좋습니다.
하지만 게임의 재미는 어려운 결정을 내리는 데에 있습니다. 예를 들어, 2, 3, 4, 6, 6, 6이 굴러왔을 때, 세 개의 6을 보관하여 600 점을 얻을 수 있습니다. 하지만 나머지 세 개의 주사위를 굴려야 할지, 아니면 턴을 끝내고 600 점을 확정해야 할지 결정해야 합니다. 이 경우, 600 점을 지키는 것이 나은 선택입니다. 왜냐하면 최적 전략으로 세 개의 주사위를 굴렸을 때 기대할 수 있는 점수는 547점이기 때문입니다.
주사위를 보관할지 결정하는 것도 어려울 수 있어요. 예를 들어, 3, 3, 3, 5, 5, 6을 굴려서 나왔다고 하죠. 세 개의 3과 두 개의 5를 400 포인트로 보관해야 할까요, 아니면 하나의 5만 보관하고 5개의 주사위를 굴려야 할까요? 만약 50 포인트가 있고 5개의 주사위를 굴릴 경우, 기대할 수 있는 포인트는 368 포인트입니다. 그러니까 400 포인트를 보관하고 턴을 종료하는 것이 나을 거예요.
확률 계산
특정한 수의 주사위를 굴릴 때 기대할 수 있는 포인트를 어떻게 구할까요? 이전 예시인 2, 3, 4, 6, 6, 6을 굴렸다고 가정해봅시다. 600 포인트를 가지고 있는 상황에서 멈출 수도 있고 세 개의 주사위를 더 굴릴 수도 있어요. 세 개의 주사위를 굴렸을 때, 6³ (216)가지 가능한 결과가 나옵니다. 이 세 주사위를 굴린 후의 기대 점수를 알고 싶은데, 이는 이 216가지 가능한 결과에 대한 평균 점수입니다.
기대값
게임을 간단하게 하여 세 개의 주사위를 굴린 후에 턴이 끝나며, 계속해서 굴릴 수 없는 상황이라고 가정해 봅시다. 어떤 굴림은 현재 600점의 점수에 점수를 추가하고, 어떤 굴림(28%)은 파글(Farkle)로 끝내며 이번 턴에 0점을 얻습니다. 예를 들어, 1, 1, 5를 굴리면 턴 총합은 850점으로 250점을 추가할 것입니다. 하지만 2, 3, 4를 굴리면 파글(Farkle)로 인해 이번 턴에 0점을 얻습니다. 이러한 상황에서 216가지 가능한 굴림을 모두 살펴보고 각각의 점수를 계산할 수 있습니다. 세 개의 주사위를 굴릴 때 기대되는 값은 520점이 됩니다.
물론, 세 개의 주사위를 굴린 후에 계속 굴릴 수 있는 경우에는 상황이 더 복잡해집니다. 예를 들어, 1, 1, 5를 굴렸을 때 250점이 추가되고 6개의 주사위를 모두 다시 굴릴 수 있게 됩니다. 실제 예상 점수를 찾으려면 850점을 가지고 6개의 주사위를 굴릴 때의 기대 값을 고려해야 합니다. 이것은 다른 다양한 상황에서의 기대 값을 알아야 가능한 것입니다. 실제로 이런 일은 끝나지 않습니다. 파글을 하지 않는 것의 영향을 결정하기 위해 계속해서 굴림을 하게 될 것입니다.
이 문제를 해결하기 위해 굴릴 수 있는 최대 점수를 정할 수 있습니다. 예를 들어, 한 턴에 50,000점을 얻으면 턴을 종료하는 것으로 정할 수 있습니다 (이것은 안전한 선택입니다, 왜냐하면 게임은 10,000점까지 진행되기 때문입니다). 이제 우리는 끝이 없는 미로 같은 상황에 빠지지 않고 어떤 상황에서도 기대 값을 계산할 수 있습니다.
이러한 탐구과정은 다음과 같습니다: 프로그램에게 턴을 시작할 때 (테이블에 0점이 있는 상황에서) 6개의 주사위를 굴릴 때의 기대 점수를 찾도록 요청합니다. 6⁶ (46,656)가지 가능한 굴림이 있습니다. 이 각각의 굴림에 대해, 유지할 수 있는 주사위의 가능한 조합을 살펴보고 턴을 종료하는 것이 낫거나 계속해서 굴리면 점수를 추가할 수 있는지 확인합니다. 계속해서 굴리면 얼마나 많은 점수를 기대할 수 있는지 알기 위해서는 얼마나 많은 점수를 예상할 수 있는지를 알아야 합니다. 그 값을 모르는 경우, 프로그램에게 기다리고 그 상황에서의 기대 점수를 찾도록 요청합니다. 새로운 상황에서 기대 점수를 계산할 때, 다시 같은 문제에 직면하게 됩니다: 예를 들어, 150점이 테이블에 있는 상황에서 4개의 주사위를 굴릴 때 얼마나 많은 점수를 기대할 수 있는지를 모릅니다. 이러한 상황은 계속해서 나오게 됩니다. 하지만 우리가 끝점을 선택하지 않았다면 무한히 계속할 것입니다. 그러나 우리는 프로그램에게 50,000점 이상일 때 계속 굴릴지 물어보는 대신 턴을 종료하는 것이 낫다고 가정합니다. 이런 방식으로 우리는 모든 상황에서의 예상 점수를 찾을 수 있습니다.
이 Google Colab 노트북에서 예상 값들을 찾기 위해 사용한 코드를 살펴볼 수 있어요.
최적 전략 탐색
이 예상 포인트를 어떻게 활용하여 Farkle에서 최상의 결정을 내릴 수 있을까요? 아래 그래프를 통해 특정한 주사위 수와 테이블 상의 포인트 수로 굴릴 때 기대할 수 있는 포인트 수를 볼 수 있어요.
이전 예제인 2, 3, 4, 6, 6, 6를 굴렸을 때를 생각해보겠어요. 이제 600 포인트를 가지고 있고 나머지 세 개의 주사위를 굴릴지 600 포인트를 유지할지 결정하고 싶을 것이에요. 그래프 위로 마우스를 가져가보면, 600 포인트가 테이블에 있을 때, 세 개의 주사위를 굴리면 평균적으로 547 포인트를 기대할 수 있다는 것을 알 수 있어요. 그래서 600 포인트를 유지하는 것이 나아요. 그러나, 2, 3, 3, 3, 4, 6을 굴린 경우, 300 포인트를 가져가고 계속 굴리는 것이 좋을 것이며, 평균적으로 332 포인트를 기대할 수 있을 거예요.
혹은, 1500 점을 얻은 다음 여섯 개의 주사위를 다시 굴린 후 1, 1, 2, 2, 2, 4를 얻었다고 가정해보겠습니다. 최종 점수로 1개의 1과 3개의 2를 보관하여 1900 점을 획득할지, 1개의 1을 보관하고 다섯 개의 주사위를 굴릴지 고민해봅시다. 후자의 선택으로 1600 점을 받고 다섯 개의 주사위를 굴리는 것은 평균적으로 1715 점을 얻게 됩니다. 따라서 1900 점을 보관하는 것이 더 나은 선택입니다.
어떤 상황에서든 상황에 따라 점수를 극대화할 결정을 내릴 수 있습니다.
라이딩
Farkle의 가장 흥미로운 규칙에 대해 아직 이야기하지 않았습니다. 이 규칙은 여러 사람이 솔로로 게임을 하는 것(블랙잭과 마찬가지로)에서 다른 플레이어의 행동이 서로에게 영향을 미치는 경쟁적인 멀티플레이어 게임으로 변모시킵니다. 그 규칙은 다음과 같습니다: 이전 플레이어가 남은 주사위를 굴리는 대신 턴을 종료하기로 선택했을 때, 여러분은 그들의 남은 주사위를 굴릴 수 있고 그 점수에 추가할 수 있습니다. 예를 들어, 이전 플레이어가 1600 점을 보유하고 남은 세 개의 주사위를 테이블에 두었다면, 여러분은 그 세 개의 주사위를 이용해 그들의 1600 점에 계속 추가할 수 있습니다(여전히 여러분의 차례에 관계 없이 그들은 1600 점을 유지합니다).
언제 타고 언제 차례를 시작할지 어떻게 알 수 있을까요? 상대방의 주사위를 굴리는 기댓값과 처음부터 시작하는 것을 비교할 수 있어요. 우리가 1600포인트에서 세 개의 주사위를 굴리면 1266포인트를 기대할 수 있어요. 테이블에 포인트가 없는 상태에서 여섯 개의 주사위를 굴리면 591포인트를 기대할 수 있죠. 분명 상대방의 포인트를 그대로 가져가는 것이 나아요. 만약 상대가 650포인트를 획득하고 나서 세 개의 주사위를 넘겨준다면 어떨까요? 타면 583포인트를 기대할 수 있어요 — 이 경우 처음부터 시작하는 것보다 적어요. 하지만 만약 700포인트를 넘겨주었다면, 619포인트를 기대할 수 있어요. 이런 경우에는 타는 것이 좋아요.
요령 카드
매주 열리는 Farkle 밤에 최적의 선택을 도와줄 그래프나 차트를 가져가도 좋지만 매주 그 날 밤에 친구들이 바쁘다고 할지도 몰라요. 대신, 우리는 즉흥적으로 최적의 전략을 사용하는 방법에 대해 알아볼게요.
이전 그래프와 동일한 그래프를 준비했어요. 두 개의 선을 추가하고 교차점을 표시해 봤어요.
대각 점선은 현재 얻은 점수와 굴릴 때 기대되는 점수가 같을 때의 지점을 나타냅니다. 다시 말해, 그래프를 굴릴지 계속해서 굴릴지 결정해야 하는 시나리오와 턴을 끝내야 하는 시나리오로 나눕니다. 800점을 가지고 4개의 주사위를 굴릴 때 점선 위에 나타납니다. 이는 가지고 있는 점수를 유지하는 것보다 굴려서 더 많은 점수를 기대할 수 있다는 것을 의미하며, 600점을 가지고 3개의 주사위를 굴릴 때는 점선 아래에 나타나는데, 주사위를 보유하는 것이 최선인 상황입니다.
수평선은 새로운 턴에서 기대할 수 있는 점수를 나타내며, 상대방의 턴을 따라가는 것이나 자신의 턴을 시작하는 것이 최선인 지점을 표시합니다. 만약 상대가 2개의 주사위와 1000점을 전달한다면, 657점을 기대할 수 있으며 (591점보다 높음), 따라서 그들의 턴을 따를 것입니다.
이러한 선을 교차하는 교점은 그래프와 아래 차트에서 표시되어 있습니다. "keep" 열에 표시된 점수 이상을 가지고 있다면 굴리지 말고 주사위를 유지해야 하고, "ride" 열에 표시된 점수 이상을 상대방이 전달했다면 새로 시작하는 대신 상대의 턴을 타야 합니다.
주사위 | 유지 | 타기
------|-------|------
1 | 350 | 1250
2 | 250 | 900
3 | 450 | 700
4 | 1050 | 550
5 | 3100 | 350
6 | 18000 | -
이 표를 통해 특정 주사위를 얻은 후에 굴리거나 유지하는 것이 더 나은지 알 수 있지만, 점수 매기는 주사위를 결정하는 데 도움이 되지는 않습니다. 예를 들어 1500점을 획득했고 주사위를 굴렸을 때 1, 1, 2, 2, 2, 4가 나왔을 때 무엇을 해야 하는지 알려주지 않습니다. 하나의 1을 유지하고 다섯 개의 주사위를 굴릴 수도 있고, 두 개의 1과 모든 3개의 2를 유지하고 턴을 끝낼 수도 있습니다.
이 그래프를 참조하지 않고 이러한 옵션을 비교하려면 예상 값 선을 형성하는 방정식을 알아야 합니다. 그래프를 다시 살펴보면 각 선이 거의 일직선이라는 것을 알 수 있습니다. 즉, 주어진 기울기와 y절편이 있습니다. 라인의 기울기와 y절편을 알면 주어진 주사위 수와 표 상의 주어진 점수에 대한 기대 값을 찾을 수 있습니다. 이때 사용하는 공식은 y = mx + b이며, 여기서 m은 기울기, b는 y절편, x는 표상의 점수이고 y는 굴려서 얻은 예상 점수입니다. 기울기와 y절편은 아래에서 찾을 수 있습니다. (해당 주사위 수를 굴렸을 때 부스트가 나지 않을 확률과 동일한 것으로 나타납니다.)
Dice | Slope | Intercept | Approx Slope | Approx Intercept
------|-------|-----------|--------------|------------------
1 | 0.333 | 115.63 | 1/3 | 100
2 | 0.555 | 80.72 | 0.5 | 100
3 | 0.722 | 102.06 | 0.7 | 100
4 | 0.842 | 154.60 | 0.8 | 150
5 | 0.923 | 235.98 | 0.9 | 250
6 | 0.976 | 444.96 | 1 | ∞
조금은 오만한 부류인 새내기지만, 멘탈 수학은 생각보다 별로 안 좋아해요. 저는 (0.923 * 1600 + 235.98)을 계산해서 굴려야 할지 그대로 둬야 할지 알아낼 건 없겠지만, 간단한 계산으로 대략적인 값을 얻을 수 있습니다.
우리가 이전에 1500점에서 1, 1, 2, 2, 2, 4로 주사위를 굴린 예제에 대해 시도해 봅시다. A) 한 개의 1을 선택하여 1600점을 얻고 다섯 개의 주사위를 굴릴지, B) 모든 점수 주사위를 보유하고 점수를 얻은 채로 1900점으로 턴을 종료할지 고려 중입니다. 대략적인 값들을 사용해보면, 1600점에서 다섯 개의 주사위를 굴려서 얻을 수 있는 점수는 (0.9 * 1600 + 250) = 1690점입니다. 이는 1900점보다 적으므로, 굴리는 대신에 1900점을 유지해야 합니다.
다른 예를 살펴봅시다: 첫 번째로 굴린 주사위에서 1, 1, 2, 5, 5, 6이 나왔습니다. 여기서 고려해야 할 것은 A) 1과 5를 각각 두 개씩 보유하여 300점을 얻을지, B) 1과 5를 각각 두 개씩 보유하고 나머지 두 개의 주사위를 굴릴지, C) 하나의 1을 보유하고 다섯 개의 주사위를 굴릴지 입니다. 옵션 A은 간단하게 300점을 얻습니다. 옵션 B (300점에서 두 개의 주사위를 굴리는 것 - 우리 "보유" 테이블을 따른다면 하지 않을 일)은 대략 (0.5 * 300 + 100) = 250점을 얻습니다. 옵션 C (100점에서 다섯 개의 주사위를 굴리는 것)은 대략 (0.9 * 100 + 250) = 340점을 얻습니다. 우리는 하나의 1을 유지하고 계속해서 점수를 최대화하기 위해 계속 굴릴 필요가 있습니다.
이 몇 가지 숫자를 기억하고 간단한 산수를 할 수 있다면, Farkle 게임을 거의 완벽하게 플레이할 수 있을 것입니다.
알고리즘 대결
얼마나 완벽에 가까운가요? 최적 전략과 근사 전략을 코딩해보고, 수천 번의 게임에서 우리가 근사 전략으로 이길 확률을 확인할 수 있어요. 그리고 거기에 세 개의 알고리즘 참가자를 추가해볼 거에요.
코리의 게임
첫 번째 경쟁자는 경험 많은 플레이어의 전략을 모방하려는 알고리즘이에요. 충분히 Farkle을 플레이해 대부분의 다이스에 빠르고 직관적인 판단을 내릴 수 있는 경험이 있는 친구 코리에게 도움을 요청해 그녀의 전략을 코딩할 수 있었어요. Google Colab 노트북에서 전체 의사결정 과정을 확인할 수 있는데, "만약 3개의 2를 제외한 그 어떤 옵션도 3개 이상의 특정 숫자를 포함하고 있다면 모든 점수 획득 다이스를 보관하고, 나머지 3개의 주사위가 남아 있는 경우 다시 굴린다. 단, 세 개의 5 또는 세 개의 6일 경우에는 해당하지 않는다."와 같은 의사결정을 포함하고 있어요.
단순 전략
제 두 번째 알고리즘은 비교할 기준을 제공하기 위해 매우 간단한 알고리즘입니다. 이 플레이어는 매우 간단한 규칙을 따릅니다: 항상 점수를 얻을 수 있는 주사위를 모두 가져가고, 세 개 이상의 주사위가 남아있을 때는 계속해서 굴리는 것입니다. 상대방이 1000점 이상을 넘기면 상대 턴을 타락합니다.
경쟁 전략
마지막 경쟁자는 상대방의 타락 능력을 고려하는 알고리즘입니다. 예를 들어 굉장한 턴을 겪어 5개의 주사위가 남아 3100점을 기록했다고 가정해봅시다 (아마도 두 개의 스트레이트와 한 개의 1이 있을 것입니다). 이 3100점을 유지하는 것이 5개의 주사위를 굴린다는 것보다 약간 나아보이지만 (평균적으로 3005점을 얻게됩니다), 당신은 상대방에게 굉장한 기회를 넘겨주게 됩니다. 상대방은 당신의 턴에 타락하면 같은 3005점을 기대할 수 있습니다. 이것은 새로운 턴에서 기대할 수 있는 591점보다 훨씬 좋은 점수입니다. 이러한 점을 고려하면 사실은 5개의 주사위를 굴리고 상대방에게 더 나쁜 기회를 넘기기를 희망하는 것이 더 좋다는 것을 알 수 있습니다.
이를 고려하여 어떻게 전략을 조정해야 할까요? 이전에는 어떤 결정이 우리에게 가장 많은 점수를 줄지를 물었고, 어떤 결정에서 기대할 수 있는 점수를 계산했습니다. 이제는 상대방에게 우리보다 가장 많은 점수를 주는 결정이 무엇인지 물어봅니다. 우리가 어떤 주사위를 넘기게되면 상대방이 기대할 수 있는 점수를 계산하여 상대방이 얼마를 기대할지 생각합니다. 여전히 모든 가지를 탐색하여 어떤 굴림에서 기대할 수 있는 점수를 확인하지만, 우리가 주사위를 보유할 때 상대방이 기대하는 점수를 계속 추적하고, 보유할 점수와 상대방에게 넘길 점수 사이의 차이를 최대화하는 옵션을 선택합니다.
대결
이제 우리는 각각의 대체 알고리즘을 우리의 최적 전략과 맞대어보게 됩니다. 아래에서는 각 경쟁자가 10,000 점을 획득하는 100,000 게임을 진행한 결과를 볼 수 있습니다.
이긴 게임 퍼센트
(10,000 점을 향해 100,000 게임에서)
| 새로운 컨텐더 | 최적 전략
--------------------------------|---------------|------------------
대략적으로 최적 전략 | 49.4% | 50.6%
Corey의 게임 | 44.4% | 55.6%
순진한 전략 | 25.1% | 74.9%
경쟁적 전략 | 50.8% | 49.2%
모든 경쟁자가 거의 동일한 성능을 보이는 반전 사실입니다. 우리의 최적 전략, 즉 완벽한 Farkle 게임을 하는 것이 여느 똑똑한 플레이어보다 약간 더 자주 이기게 됩니다. 심지어 우리의 순진한 전략도 두 가지 간단한 규칙을 따르기만 해도 25%의 승률을 기록합니다. 이는 Farkle이 전략보다는 운의 게임임을 강조합니다. 완벽한 결정을 내리고 있더라도 나쁜 주사위 굴림을 받을 수도 있기 때문입니다.
하지만 1만 점이 아니라 100만 점까지 하는 게임을 우리가 하게 되면 운이 더 적게 개입합니다. 아래 표는 1000번의 게임을 100만 점까지 하는 결과를 보여줍니다.
| 승률 | (100만 점을 향한 1,000번의 게임에서)
| 새로운 도전자 | 최적 전략
--------------------------------|---------------|------------------
대략적으로 최적 전략 | 46.7% | 53.3%
코리의 게임 | 12.3% | 87.7%
나이브 전략 | 0% | 100%
경쟁 전략 | 64.1% | 35.9%
이제 대략적으로 최적인 전략이 여전히 최적 전략과 비슷한 결과를 보여주는 것을 볼 수 있습니다. 우리의 최적 전략은 똑똑하지만 완벽하지 않은 인간 플레이어를 압도합니다. 우리의 나이브 전략은 기회조차 주지 않습니다. 경쟁 전략은 최적(비경쟁) 전략을 능가합니다.
전개 중
우리는 이제 Farkle의 최적 전략을 알고 있고 거의 완벽한 게임을 플레이할 수 있는 도움말을 가지고 있습니다. 충분한 게임을 플레이하면 우리 친구들보다 더 자주 이길 수 있게 Farkle 밤에 참석할 수 있습니다. 적어도 매우 어려운 결정마다 "옳은 선택이 있어, 옳은 선택이 뭐지..."라고 생각하는 것을 그만 둘 수 있습니다.
더 경쟁력 있는 알고리즘을 고안할 수 있다고 생각하면 자유롭게 구현하고 Google Colab 노트북을 편집하여 내 알고리즘에 대한 성능을 확인해 보세요.