<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Algorithm on philipjkim</title><link>https://philipjkim.cc/tags/algorithm/</link><description>Recent content in Algorithm on philipjkim</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Mon, 10 Aug 2026 08:51:18 +0900</lastBuildDate><atom:link href="https://philipjkim.cc/tags/algorithm/index.xml" rel="self" type="application/rss+xml"/><item><title>렉시오 CPU 플레이어 만들기 Part 6: 봇이 약한지 어떻게 아는가</title><link>https://philipjkim.cc/posts/20260810-lexio-cpu-bot-strategy-06/</link><pubDate>Mon, 10 Aug 2026 08:51:18 +0900</pubDate><guid>https://philipjkim.cc/posts/20260810-lexio-cpu-bot-strategy-06/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="눈으로-한-판-돌려서는-못-보는-것"&gt;눈으로 한 판 돌려서는 못 보는 것&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260807-lexio-cpu-bot-strategy-05/"&gt;Part 5&lt;/a&gt; 에서 고친 결함은 눈에 보이는 것이었습니다. 봇이 거의 모든 턴을 패스했고, 브라우저에서 5인 게임을 한 판 돌리자 바로 드러났습니다.&lt;/p&gt;
&lt;p&gt;그 방법에는 한계가 분명합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;봇이 100% 패스한다 → 한 판이면 보입니다&lt;/li&gt;
&lt;li&gt;봇이 라운드당 1.4점씩 잃는다 → 몇 판을 돌려도 느낄 수 없습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;렉시오는 딜 운의 분산이 큽니다. 좋은 패를 받은 판과 나쁜 패를 받은 판의 차이가 정책의 차이보다 훨씬 크기 때문에, 사람이 몇 판 보고 &amp;ldquo;이 봇이 좀 약한 것 같다&amp;quot;고 말하는 것은 근거가 되지 못합니다. 측정 도구 없이 가중치를 만지면 더 나쁩니다. 고쳤다고 생각한 것이 실은 운이었는지 확인할 방법이 없습니다.&lt;/p&gt;</description></item><item><title>렉시오 CPU 플레이어 만들기 Part 5: 봇이 아무것도 하지 않는 이유</title><link>https://philipjkim.cc/posts/20260807-lexio-cpu-bot-strategy-05/</link><pubDate>Fri, 07 Aug 2026 07:56:13 +0900</pubDate><guid>https://philipjkim.cc/posts/20260807-lexio-cpu-bot-strategy-05/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="설계와-구현-사이"&gt;설계와 구현 사이&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260731-lexio-cpu-bot-strategy-01/"&gt;Part 1&lt;/a&gt; 부터 &lt;a href="https://philipjkim.cc/posts/20260731-lexio-cpu-bot-strategy-04/"&gt;Part 4&lt;/a&gt; 까지는 설계안이었습니다. 타일을 정수로 압축하고, 미공개 집합을 복원하고, 손패 분해를 DP 로 풀고, 목적 함수를 정산식에서 유도해 평가 함수의 항을 나열했습니다. 코드 조각은 있었지만 돌려 본 적은 없었습니다.&lt;/p&gt;
&lt;p&gt;이번 편은 그 설계를 실제로 구현해 브라우저에서 5인 게임을 돌려 본 기록입니다. 결과부터 적겠습니다. &lt;strong&gt;봇이 거의 모든 턴을 패스했습니다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;원인을 추적하고 나서 든 생각은 &amp;ldquo;설계가 틀렸다&amp;quot;가 아니었습니다. 항을 하나씩 뜯어보면 Part 4 가 쓴 대로였고, 개별 함수는 각각 맞는 값을 돌려주고 있었습니다. 틀린 것은 &lt;strong&gt;항을 합치는 방식&lt;/strong&gt; 이었고, 그중 일부는 Part 1~4 가 아예 말하지 않은 자리였습니다.&lt;/p&gt;</description></item><item><title>달무티 CPU 플레이어 만들기 Part 4: 만들어 보니 hard 봇이 더 약했다</title><link>https://philipjkim.cc/posts/20260803-dalmuti-cpu-bot-strategy-04/</link><pubDate>Mon, 03 Aug 2026 17:57:55 +0900</pubDate><guid>https://philipjkim.cc/posts/20260803-dalmuti-cpu-bot-strategy-04/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="설계안이-검증을-만나면"&gt;설계안이 검증을 만나면&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260730-dalmuti-cpu-bot-strategy-01/"&gt;Part 1&lt;/a&gt;에서 공정성 경계와 결정적 easy 봇을 만들었고, &lt;a href="https://philipjkim.cc/posts/20260730-dalmuti-cpu-bot-strategy-02/"&gt;Part 2&lt;/a&gt;에서 hard 봇의 정보 모델을 세웠고, &lt;a href="https://philipjkim.cc/posts/20260730-dalmuti-cpu-bot-strategy-03/"&gt;Part 3&lt;/a&gt;에서 수 평가 함수와 전략적 패스로 실제 결정을 내렸습니다. 세 편 모두 &amp;ldquo;이 글은 설계안이고 코드는 논지를 보이기 위한 발췌&amp;quot;라고 밝혀 두었습니다.&lt;/p&gt;
&lt;p&gt;그 설계안을 실제 게임에 구현하고, 시뮬레이터를 붙여 easy 봇과 같은 조건에서 붙여 봤습니다. 결과는 이랬습니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;최초 hard 봇은 easy 봇보다 &lt;strong&gt;평균 종료 순위가 0.6601등 나빴습니다.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>8비트의 벽을 넘은 게임들 Part 5: 제약이 사라진 시대에 남은 것</title><link>https://philipjkim.cc/posts/20260803-8bit-hardware-limits-05/</link><pubDate>Mon, 03 Aug 2026 09:48:13 +0900</pubDate><guid>https://philipjkim.cc/posts/20260803-8bit-hardware-limits-05/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="지금까지의-이야기"&gt;지금까지의 이야기&lt;/h2&gt;
&lt;p&gt;네 편에 걸쳐 세 작품을 뜯었습니다. 정리하면 이렇습니다.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;슈퍼 마리오브라더스&lt;/th&gt;
 &lt;th&gt;엘리트&lt;/th&gt;
 &lt;th&gt;메탈기어&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;연도 / 기종&lt;/td&gt;
 &lt;td&gt;1985 / 패미콤&lt;/td&gt;
 &lt;td&gt;1984 / BBC Micro&lt;/td&gt;
 &lt;td&gt;1987 / MSX2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;부족했던 자원&lt;/td&gt;
 &lt;td&gt;ROM 40KB&lt;/td&gt;
 &lt;td&gt;RAM 32KB&lt;/td&gt;
 &lt;td&gt;스프라이트, 가로 스크롤&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;전략&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;압축&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;생성&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;전복&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;핵심 기법&lt;/td&gt;
 &lt;td&gt;오브젝트 2바이트 인코딩&lt;/td&gt;
 &lt;td&gt;트리보나치 씨앗 트위스팅&lt;/td&gt;
 &lt;td&gt;요구사항 자체를 바꿈&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;세계 데이터&lt;/td&gt;
 &lt;td&gt;4,460 바이트&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;6 바이트&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;20,246 바이트&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;치른 대가&lt;/td&gt;
 &lt;td&gt;표현 가능한 오브젝트가 제한됨&lt;/td&gt;
 &lt;td&gt;세부를 손댈 수 없음&lt;/td&gt;
 &lt;td&gt;원래 만들려던 게임을 포기함&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이 마지막 편에서는 이 세 가지가 40년 뒤에 어떻게 됐는지 봅니다.&lt;/p&gt;</description></item><item><title>8비트의 벽을 넘은 게임들 Part 4: 메탈기어, 못 그리는 것을 안 그려도 되게 만들다</title><link>https://philipjkim.cc/posts/20260803-8bit-hardware-limits-04/</link><pubDate>Mon, 03 Aug 2026 09:43:31 +0900</pubDate><guid>https://philipjkim.cc/posts/20260803-8bit-hardware-limits-04/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="세-번째-길"&gt;세 번째 길&lt;/h2&gt;
&lt;p&gt;앞의 두 편에서 본 전략을 정리하면 이렇습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://philipjkim.cc/posts/20260803-8bit-hardware-limits-02/"&gt;Part 2&lt;/a&gt; 슈퍼 마리오브라더스: &lt;strong&gt;데이터를 작게 만든다.&lt;/strong&gt; 레벨 오브젝트 2바이트 인코딩.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://philipjkim.cc/posts/20260803-8bit-hardware-limits-03/"&gt;Part 3&lt;/a&gt; 엘리트: &lt;strong&gt;데이터를 갖지 않는다.&lt;/strong&gt; 씨앗 6바이트에서 우주 전체를 계산.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;둘 다 &amp;ldquo;요구사항은 그대로 두고 구현을 비튼다&amp;rdquo; 는 접근입니다. 1987년 코나미의 MSX2 팀은 세 번째 길을 갔습니다. &lt;strong&gt;요구사항 자체를 바꿨습니다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;결과물이 메탈기어이고, 그 결과물이 만든 것은 게임 하나가 아니라 &lt;strong&gt;장르 하나&lt;/strong&gt; 였습니다.&lt;/p&gt;</description></item><item><title>8비트의 벽을 넘은 게임들 Part 3: 엘리트, 우주를 6바이트에 담다</title><link>https://philipjkim.cc/posts/20260803-8bit-hardware-limits-03/</link><pubDate>Mon, 03 Aug 2026 09:33:14 +0900</pubDate><guid>https://philipjkim.cc/posts/20260803-8bit-hardware-limits-03/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="저장하지-않으면-용량도-들지-않는다"&gt;저장하지 않으면 용량도 들지 않는다&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260803-8bit-hardware-limits-02/"&gt;Part 2&lt;/a&gt;에서 본 슈퍼 마리오브라더스의 전략은 &lt;strong&gt;데이터를 작게 만드는 것&lt;/strong&gt; 이었습니다. 레벨 오브젝트를 2바이트로 인코딩해 게임 전체의 스테이지 데이터를 4,460바이트에 넣었습니다.&lt;/p&gt;
&lt;p&gt;1984년 BBC Micro 로 나온 엘리트는 한 걸음 더 나갑니다. &lt;strong&gt;데이터를 아예 갖지 않습니다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;먼저 규모를 봅시다. 엘리트에는 은하가 8개 있고, 은하마다 항성계가 256개 있습니다. &lt;strong&gt;총 2,048개&lt;/strong&gt; 입니다. 각 항성계에는 고유한 이름이 있고, 좌표가 있고, 경제 형태, 정부 형태, 기술 수준, 인구, 총생산, 행성 반지름, 지배 종족이 있습니다.&lt;/p&gt;</description></item><item><title>8비트의 벽을 넘은 게임들 Part 2: 슈퍼 마리오브라더스, 레벨을 그리지 않고 서술하다</title><link>https://philipjkim.cc/posts/20260803-8bit-hardware-limits-02/</link><pubDate>Mon, 03 Aug 2026 09:24:56 +0900</pubDate><guid>https://philipjkim.cc/posts/20260803-8bit-hardware-limits-02/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="4460바이트짜리-세계"&gt;4,460바이트짜리 세계&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260803-8bit-hardware-limits-01/"&gt;Part 1&lt;/a&gt;에서 확인한 제약을 다시 꺼내 놓겠습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;슈퍼 마리오브라더스 카트리지는 PRG-ROM 32KB + CHR-ROM 8KB = &lt;strong&gt;40KB&lt;/strong&gt; 입니다.&lt;/li&gt;
&lt;li&gt;한 프레임 중 VRAM 을 만질 수 있는 시간은 2,273 사이클이고, 스프라이트 DMA 를 빼면 배경에 쓸 수 있는 것은 &lt;strong&gt;약 220바이트&lt;/strong&gt; 입니다.&lt;/li&gt;
&lt;li&gt;6502 에는 곱셈 명령이 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 세 줄을 지키면서 32개 스테이지가 흐르는 게임을 만들어야 합니다.&lt;/p&gt;</description></item><item><title>8비트의 벽을 넘은 게임들 Part 1: 그 기계들은 무엇을 못 했는가</title><link>https://philipjkim.cc/posts/20260803-8bit-hardware-limits-01/</link><pubDate>Mon, 03 Aug 2026 09:06:15 +0900</pubDate><guid>https://philipjkim.cc/posts/20260803-8bit-hardware-limits-01/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="스크린샷-한-장보다-작은-게임"&gt;스크린샷 한 장보다 작은 게임&lt;/h2&gt;
&lt;p&gt;슈퍼 마리오브라더스가 담긴 카트리지의 ROM 용량은 &lt;strong&gt;40KB&lt;/strong&gt; 입니다. 프로그램 32KB, 그림 데이터 8KB. 이게 전부입니다.&lt;/p&gt;
&lt;p&gt;이 게임의 한 장면을 오늘날의 화면에서 캡처해 PNG 로 저장하면 보통 수백 KB 가 나옵니다. &lt;strong&gt;게임 하나가 그 게임의 스크린샷 한 장보다 작습니다.&lt;/strong&gt; 32개 스테이지, 여덟 가지 배경음악, 마리오의 물리 엔진, 적 AI, 점수 계산, 타이틀 화면이 전부 저 40KB 안에 있습니다.&lt;/p&gt;</description></item><item><title>렉시오 CPU 플레이어 만들기 Part 4: 수 평가와 정산 기대값</title><link>https://philipjkim.cc/posts/20260731-lexio-cpu-bot-strategy-04/</link><pubDate>Fri, 31 Jul 2026 09:44:26 +0900</pubDate><guid>https://philipjkim.cc/posts/20260731-lexio-cpu-bot-strategy-04/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="재료에서-결정으로"&gt;재료에서 결정으로&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260731-lexio-cpu-bot-strategy-02/"&gt;Part 2&lt;/a&gt; 에서 봇이 무엇을 아는지, &lt;a href="https://philipjkim.cc/posts/20260731-lexio-cpu-bot-strategy-03/"&gt;Part 3&lt;/a&gt; 에서 자기 손패를 어떻게 보는지 만들었습니다. 아직 결정은 하나도 하지 않았습니다. 이번 편에서 전부 합칩니다.&lt;/p&gt;
&lt;p&gt;그런데 합치기 전에 답해야 할 질문이 하나 있습니다. &lt;strong&gt;무엇을 최대화할 것인가.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;달무티에서는 이 질문이 쉬웠습니다. 등수가 곧 다음 판의 계급이고 점수도 등수에 비례하므로, &amp;ldquo;평균 등수를 낮춘다&amp;quot;가 그대로 목적 함수였습니다. 렉시오는 다릅니다. 렉시오에는 등수가 없습니다. &lt;strong&gt;금액만 있습니다.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>렉시오 CPU 플레이어 만들기 Part 3: 손패 분해 플랜</title><link>https://philipjkim.cc/posts/20260731-lexio-cpu-bot-strategy-03/</link><pubDate>Fri, 31 Jul 2026 09:37:44 +0900</pubDate><guid>https://philipjkim.cc/posts/20260731-lexio-cpu-bot-strategy-03/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="좋은-손패는-센-손패가-아니다"&gt;좋은 손패는 센 손패가 아니다&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260731-lexio-cpu-bot-strategy-02/"&gt;Part 2&lt;/a&gt; 에서는 봇이 상대에 대해 무엇을 알 수 있는지 정리했습니다. 이번 편은 시선을 안으로 돌립니다. &lt;strong&gt;내 손패는 몇 번 제출하면 비는가.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;이 질문이 왜 중요한지는 &lt;a href="https://philipjkim.cc/posts/20260727-climbing-card-games-daifugo-dalmuti-lexio/"&gt;클라이밍 게임 전략 글&lt;/a&gt;에서 이미 짚었습니다. 강한 타일이 많은 손패와 조합이 잘 짜인 손패 중 이기는 쪽은 후자입니다. 강한 타일은 한 번에 한 장씩 나가지만, 잘 짜인 손패는 다섯 장씩 나갑니다.&lt;/p&gt;</description></item><item><title>렉시오 CPU 플레이어 만들기 Part 2: 60비트 카운팅과 확실승수 판정</title><link>https://philipjkim.cc/posts/20260731-lexio-cpu-bot-strategy-02/</link><pubDate>Fri, 31 Jul 2026 09:30:12 +0900</pubDate><guid>https://philipjkim.cc/posts/20260731-lexio-cpu-bot-strategy-02/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="hard-봇이-지켜야-할-세-가지"&gt;hard 봇이 지켜야 할 세 가지&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260731-lexio-cpu-bot-strategy-01/"&gt;Part 1&lt;/a&gt; 에서 만든 easy 봇은 이번 턴에 합법적인 가장 싼 수를 계산할 뿐이었습니다. 이번 편부터 hard 봇을 설계합니다. 다만 시작하기 전에 지켜야 할 선을 못 박아 두겠습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;공정성.&lt;/strong&gt; 봇은 &lt;code&gt;GameView&lt;/code&gt; 만 봅니다. 남의 손패는 그 구조체 어디에도 존재하지 않습니다. 봇이 강해지는 이유는 &lt;strong&gt;더 많이 보기 때문이 아니라, 같은 것을 보고 더 잘 세기 때문&lt;/strong&gt; 이어야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;결정성.&lt;/strong&gt; 같은 입력에서는 같은 출력이 나와야 합니다. 그래야 봇 로직이 테스트 가능한 코드가 됩니다. 난수를 쓴다면 시드를 게임 상태에서 유도합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;실시간성.&lt;/strong&gt; 봇의 판단은 사람이 기다릴 수 있는 시간 안에 끝나야 합니다. 이 제약이 뒤에서 &amp;ldquo;몬테카를로를 런타임에 돌리지 않는다&amp;quot;는 설계 결정으로 이어집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이번 편은 hard 봇이 &lt;strong&gt;무엇을 아는가&lt;/strong&gt; 를 다룹니다. 무엇을 결정하는가는 Part 3 과 Part 4 의 몫입니다.&lt;/p&gt;</description></item><item><title>렉시오 CPU 플레이어 만들기 Part 1: 타일 하나를 정수 하나로</title><link>https://philipjkim.cc/posts/20260731-lexio-cpu-bot-strategy-01/</link><pubDate>Fri, 31 Jul 2026 09:22:31 +0900</pubDate><guid>https://philipjkim.cc/posts/20260731-lexio-cpu-bot-strategy-01/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="사촌-게임-전혀-다른-봇"&gt;사촌 게임, 전혀 다른 봇&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260730-dalmuti-cpu-bot-strategy-01/"&gt;어제 글&lt;/a&gt;에서 달무티(The Great Dalmuti)의 CPU 플레이어를 세 편에 걸쳐 설계했습니다. 이번에는 같은 클라이밍 계열의 국산 타일 게임 &lt;strong&gt;렉시오(Lexio)&lt;/strong&gt; 로 넘어갑니다.&lt;/p&gt;
&lt;p&gt;두 게임은 &lt;a href="https://philipjkim.cc/posts/20260727-climbing-card-games-daifugo-dalmuti-lexio/"&gt;클라이밍 게임을 정리한 글&lt;/a&gt;에서 봤듯 사촌 사이입니다. 더 센 조합으로 받아 올라가고, 손패를 먼저 비우는 쪽이 이깁니다. 그런데 봇을 짜 보면 &lt;strong&gt;알고리즘이 거의 겹치지 않습니다.&lt;/strong&gt; 달무티 봇 코드를 렉시오로 옮기려 하면 재사용할 수 있는 것은 &amp;ldquo;공정성 경계를 타입으로 못 박는다&amp;rdquo; 같은 뼈대뿐이고, 판단 로직은 전부 새로 써야 합니다.&lt;/p&gt;</description></item><item><title>달무티 CPU 플레이어 만들기 Part 3: 수 평가와 전략적 패스</title><link>https://philipjkim.cc/posts/20260730-dalmuti-cpu-bot-strategy-03/</link><pubDate>Thu, 30 Jul 2026 15:08:35 +0900</pubDate><guid>https://philipjkim.cc/posts/20260730-dalmuti-cpu-bot-strategy-03/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;정정 안내 (2026-08-03):&lt;/strong&gt; 이 글의 설계안을 실제로 구현해 시뮬레이션으로 검증한 결과, 리드 선택·세금 반환·목적 함수에 대한 일부 결론이 뒤집혔습니다. 특히 &amp;ldquo;리드 선택도 같은 계산이다&amp;rdquo; 절과 &amp;ldquo;rank 12 는 반환 카드로 나쁘다&amp;quot;는 주장은 철회되었습니다. 무엇이 왜 틀렸고 무엇이 살아남았는지는 &lt;a href="https://philipjkim.cc/posts/20260803-dalmuti-cpu-bot-strategy-04/"&gt;Part 4: 만들어 보니 hard 봇이 더 약했다&lt;/a&gt;에 정리했습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="재료에서-결정으로"&gt;재료에서 결정으로&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260730-dalmuti-cpu-bot-strategy-01/"&gt;Part 1&lt;/a&gt;에서 공정성 경계와 결정적 easy 봇을 만들었고, &lt;a href="https://philipjkim.cc/posts/20260730-dalmuti-cpu-bot-strategy-02/"&gt;Part 2&lt;/a&gt;에서 hard 봇의 정보 모델을 세웠습니다. 지금까지 확보한 재료는 셋입니다.&lt;/p&gt;</description></item><item><title>달무티 CPU 플레이어 만들기 Part 2: hard 봇의 정보 모델과 확실승수 판정</title><link>https://philipjkim.cc/posts/20260730-dalmuti-cpu-bot-strategy-02/</link><pubDate>Thu, 30 Jul 2026 14:18:37 +0900</pubDate><guid>https://philipjkim.cc/posts/20260730-dalmuti-cpu-bot-strategy-02/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="hard-봇이-지켜야-할-세-가지"&gt;hard 봇이 지켜야 할 세 가지&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260730-dalmuti-cpu-bot-strategy-01/"&gt;Part 1&lt;/a&gt;에서는 달무티 CPU 플레이어의 뼈대를 잡고, 결정적 규칙만으로 움직이는 easy 봇을 만들었습니다. easy 봇은 합법적이고 예측 가능하지만, &amp;ldquo;낼 수 있으면 무조건 낸다&amp;quot;는 정책 때문에 사람에게 쉽게 집니다.&lt;/p&gt;
&lt;p&gt;이번 편부터 hard 봇을 설계합니다. 설계 제약은 세 가지입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 상대의 손패는 절대 볼 수 없습니다.&lt;/strong&gt; 봇은 Part 1 에서 정의한 &lt;code&gt;GameView&lt;/code&gt; 만 받습니다. 난이도를 올리기 위해 정보를 더 주는 것은 설계가 아니라 반칙입니다. 사람이 &amp;ldquo;저 봇 손패 보는 거 아니야?&amp;ldquo;라고 의심하는 순간 게임의 신뢰가 무너집니다.&lt;/p&gt;</description></item><item><title>달무티 CPU 플레이어 만들기 Part 1: 규칙 기반 easy 봇</title><link>https://philipjkim.cc/posts/20260730-dalmuti-cpu-bot-strategy-01/</link><pubDate>Thu, 30 Jul 2026 14:09:37 +0900</pubDate><guid>https://philipjkim.cc/posts/20260730-dalmuti-cpu-bot-strategy-01/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;후속 정정 안내 (2026-08-03):&lt;/strong&gt; 이 시리즈의 설계안을 실제로 구현해 시뮬레이션으로 검증한 결과, 여기서 &amp;ldquo;easy 봇의 단순화&amp;quot;로 소개한 &lt;strong&gt;리드 정책과 세금 반환 규칙이 hard 봇의 복잡한 평가식보다 강했고&lt;/strong&gt;, 지금은 hard 봇의 guardrail 로 채택돼 있습니다. 자세한 내용은 &lt;a href="https://philipjkim.cc/posts/20260803-dalmuti-cpu-bot-strategy-04/"&gt;Part 4: 만들어 보니 hard 봇이 더 약했다&lt;/a&gt;에 정리했습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="왜-봇부터-만드는가"&gt;왜 봇부터 만드는가&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260727-climbing-card-games-daifugo-dalmuti-lexio/"&gt;지난 글&lt;/a&gt;에서 대부호·달무티·렉시오를 묶어 클라이밍 게임의 전략을 정리했습니다. 이번에는 그중 &lt;strong&gt;달무티(The Great Dalmuti)&lt;/strong&gt; 를 디지털 게임으로 구현한다고 가정하고, &lt;strong&gt;CPU 플레이어를 어떤 전략으로 움직일 것인가&lt;/strong&gt; 를 파고들겠습니다.&lt;/p&gt;</description></item></channel></rss>