<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>이왓슨 작업실</title>
    <link>https://leewatson.tistory.com/</link>
    <description>달을 향해 쏴라, 빗나가도 별이 될테니.</description>
    <language>ko</language>
    <pubDate>Sat, 25 Jul 2026 07:09:50 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>이왓슨</managingEditor>
    <image>
      <title>이왓슨 작업실</title>
      <url>https://tistory1.daumcdn.net/tistory/6773736/attach/c2ba50629202479c850902f5eff84846</url>
      <link>https://leewatson.tistory.com</link>
    </image>
    <item>
      <title>2026 SCSC 프로그래밍 경시대회 후기(Div.2)</title>
      <link>https://leewatson.tistory.com/126</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;0. 들어가며&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간고사가 끝날 즈음에 마침 SCSC 프로그래밍 경시대회 신청 안내가 나왔습니다. 이럴때 아니면 언제 가보겠냐는 생각으로 같은 학교인 snowwantdev를 꼬셔서 온사이트에 Div.2로 참가하게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 다 강원과학고등학교 PS동아리인 '티라노' 소속이였기 때문에 이름을 티라노사우르스에 관련된걸로 맞추기로 했습니다. 결과적으로는..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-17 오전 10.01.41.png&quot; data-origin-width=&quot;2210&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNs71e/dJMcahdn5LS/agmq4wIyRgK6Om6avYya7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNs71e/dJMcahdn5LS/agmq4wIyRgK6Om6avYya7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNs71e/dJMcahdn5LS/agmq4wIyRgK6Om6avYya7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNs71e%2FdJMcahdn5LS%2Fagmq4wIyRgK6Om6avYya7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2210&quot; height=&quot;302&quot; data-filename=&quot;스크린샷 2026-05-17 오전 10.01.41.png&quot; data-origin-width=&quot;2210&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서울대학교에 티라노사우르스 두마리가 출현하게 되었습니다. 만족스럽네요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 대회 타임라인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0:00&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A가 가장 쉬운 문제라서 A부터 봤습니다. 지문을 읽고 뭔소리인지 이해가 안되서 바로 노트에 그려봤는데, 그러고도 더 이해가 안됐습니다. $w_i$를 모든 정점에 대해서 고려해줘야해서 절대 쉽게 풀리는 문제가 아닐거같은데 어째서 A번에 있는건지.. 10분동안 생각해도 모르겠어서 슥보를 보니 A를 푼사람이 많길래 뭔가 놓치는게 있나보다 하고 바로 다른 문제로 넘어갔습니다.&lt;br /&gt;&lt;br /&gt;0:24 F WA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시를 하나 잡고 시도해보니, 그냥 수열을 정렬하고 K번째에 있는 값이 항상 $a_M$ 이라는 관찰을 할 수 있었습니다. 바로 제출했고, WA를 받았습니다.&lt;br /&gt;&lt;br /&gt;0:28 F AC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좀 더 생각을 해보니 $ M \leq N$ 이라면 정렬하기 전 원래 수열에서 $a_M$을 출력해야했습니다. 빠르게 수정하고 AC.&lt;br /&gt;&lt;br /&gt;0:28 ~ 0:45&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C가 만만해보이길래 바로 구현하려고 했습니다. 어차피 A는 어떻게든 배치할 수 있기 때문에, B가 최대한 많이 나오게, 겹칠 수 있다면 B를 최대한 겹쳐서 구성하는게 최적임을 쉽게 알 수 있습니다. $O(M^{2})$이 안되기 때문에 효율적이게 B가 겹치는 최대 길이를 판별해야했고, 알고리즘이 바로 생각이 안나서 패스했습니다.&lt;br /&gt;&lt;br /&gt;0:52 J AC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러고 나니 &lt;b&gt;슥보&lt;/b&gt;에 J솔이 많았습니다. J를 &lt;b&gt;슥 보&lt;/b&gt;니 왠지 모든 학생이 1 아니면 2 번째에 답을 맞힐 수 있을 것 같았고, '이게 답이 아니면 이렇게 많이 안풀렸겠지~' 라는 생각으로 구현해서 AC를 받았습니다.&lt;br /&gt;&lt;br /&gt;1:22 A AC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이젠 진짜 A를 풀어야겠다는 다짐으로 다시 A를 붙잡았고, 한 20분 정도 더 고민하다가 지문을 다시 읽고 깨달았습니다. &lt;b&gt;$w_{i} = 1$ 이라는 조건이 있다는걸요.&amp;nbsp;&lt;/b&gt;이렇게 되면 트리에서 위로 올라갈수록 필요한 정점 개수가 같거나 줄어들기 때문에, 답은 항상 리프노드의 개수 + 1이 됩니다. 지문을 잘 읽는 습관을 가집시다...&lt;br /&gt;&lt;br /&gt;2:01 C WA/TLE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$O(M^{2})$이 안되는걸 아는데 $O(M^{2})$ 코드를 제출했습니다. 아무생각없이 제출한건 아니고, 지금 제출한 코드가 TLE만 받는다면 로직은 올바르니 시복만 줄이면 된다는걸 알 수 있고, 만약 WA를 받으면 로직도 틀렸으니 던지자는 마인드였습니다. 그리고 WA/TLE를 동시에 받아서, 던졌습니다.&lt;br /&gt;&lt;br /&gt;2:18 D WA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분명 어디선가 본거같은 문제인데 풀이가 안떠올랐습니다. 일단 간단하게 구간에서 필요한 덧칠 개수를 누적합해서 쿼리별로 구하는 코드를 짰고, 예제가 돌길래 제출했습니다. 근데 WA를 받았어요! C부터 D까지 슬슬 말린다는 생각이 들어서 넘겼습니다.&lt;br /&gt;&lt;br /&gt;2:27 G WA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보자마자 홀짝의 느낌이 강하게 들었습니다. 대충 SCS..SC나 SC..CSC 처럼 완성되기 직전 문자열이 있으면 C를 없애서 SS..SC로 만들거나, S를 없애서 SC..CC로 만드는걸 통해서 상대방이 SCSC를 못만들게 막을 수 있기 때문에 문자열이 더 이상 없을때까지 끌고갈 수 있다고 생각했습니다. 그리고 또 WA를 받았습니다!&lt;br /&gt;&lt;br /&gt;2:31 G WA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 처음 주어진 문자열에 SCSSC나 SCCSC가 있다면, 홀짝에 상관없이 테라가 무조건 승리한다는걸 알아냈습니다. 그렇지 않으면 홀짝이겠구요. 이건 진짜맞다고 생각하면서 코드를 제출했는데.. 또 WA를 받았습니다.&lt;br /&gt;&lt;br /&gt;2:55 C WA/RE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1:22에 A를 AC한 이후로 1시간반이 넘도록 아무 문제도 풀지 못해서 멘탈이 갈려나가기 시작했습니다. 나머지 문제는 아예 모르겠고 D랑 G는 더 하면 폭사할거 같아서 다시 C로 돌아왔습니다. 다시 손테케를 만들어서 돌려보면서 로직을 고쳤고, 대회 전날에 급조한 템플릿에서 KMP를 가져와서 사용했습니다. 더 이상 틀릴리가 없다고 생각하고 제출했고, 이번에는 WA랑 RE를 동시에 받았습니다.&lt;br /&gt;&lt;br /&gt;2:59 C AC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;KMP를 사용하면서 너무 '문자열'에 집중한 나머지, 입력으로 들어오는 B는 array라는걸 망각하고 문자열로 만들어서 KMP에 집어넣었습니다. 예제와 손테케에서는 A, B의 원소를 모두 1자리수로만 구성해서 오류가 없었지만 실제로는 $10^{6}$까지 가능했기때문에 틀렸던 것 입니다! python으로 풀고 있었기때문에 그냥 KMP 함수에 문자열 대신 배열을 넣어도 올바르게 작동했고, B 배열을 직접 집어넣는것으로 결국 AC를 받았습니다.&lt;br /&gt;&lt;br /&gt;2:59 ~ 3:50&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슥보를 보니 가장 많이 풀린 6개가 A C D F G J였습니다. 남은 1시간동안 새로운 문제를 잡는건 너무 도박같았고, D와 G중에 적어도 1개는 풀어서 5솔까지 올리자는 다짐을 하고 D를 다시 잡았습니다.&lt;br /&gt;기존에는 깡으로 누적합을 했기 때문에, 쿼리로 주어지는 구간의 경계에 대한 처리가 추가로 필요하다는걸 알았습니다. 연속된 문자들을 하나로 묶은 블록마다 길이를 세주면 이분탐색으로 l, r이 어떤 블록에 있는지를 알 수 있고, 그 구간에서 경계에 걸리는 블록을 제외하고는 온전하기 때문에 바로 구간의길이//2 로 필요한 덧칠 개수를 구할 수 있습니다.&lt;br /&gt;근데 손테케에서 자꾸 틀렸습니다. 3:50이 될 시점까지 왜 틀렸는지 이유를 못찾았고, 그러다 갑자기 G가 틀린 이유가 떠올라서 G를 풀러 갔습니다.&lt;br /&gt;&lt;br /&gt;3:52 G WA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 틀린 이유를 알았다는건 단순한 착각이였습니다. SCSSC, SCCSC 말고도 SSCSC나 SCSCC가 있어도 테라가 무조건 승리한다고 생각했는데, 이 문자열들은 이미 SCSC를 포함하고 있어서 조건상 나올수가 없었습니다. 그래서 구현하다가 착각했다는걸 깨닫고, 남은 10분동안 풀 문제가 없다고 생각해서 G 코드만 하염없이 바라보고 있었습니다.&lt;br /&gt;그런데 코드를 보다가, 테라가 승리하는걸 판별했음에도 반복문 break를 안하고 flag = 1 만 하고 있다는걸 깨달았습니다! 바로 반복문 안에 flag가 1이면 break하는 코드를 추가해 제출했고, WA를 받았습니다.&lt;br /&gt;&lt;br /&gt;3:53 G AC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서 WA를 받은 이유는 들여쓰기 때문이였습니다. 4칸 들여쓰기로 코딩을 하는 저와 달리 엣코더 제출창에서는 탭을 누르면 2칸 들여쓰기가 되었고, 그것때문에 break하는 조건문이 제대로 사용되지 못한게 원인이였습니다. 그래서 확실하게 하려고 조건문을 없애고 바로 break를 하도록 로직을 바꿨고, 대회 종료를 7분 남기고 G AC를 받았습니다.&lt;br /&gt;&lt;br /&gt;3:53~4:00&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;틀린 부분만 고치면 D를 풀 수 있을거 같아서 마지막 7분도 D를 디버깅하는데에 집중했습니다. 이분탐색할때 인덱스를 잘못잡은게 있어서 고쳐주었지만 여전히 손테케에서 틀렸고, 결국 D를 풀지 못하고 5솔로 대회를 마무리했습니다.&lt;br /&gt;끝나고 업솔빙을 해보니 XXX 같은 블록까지 필요한 덧칠 개수에 포함시켜버린게 틀린 원인이였습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 마치며&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적으로 AC를 상당히 늦게 해서 5솔중에서도 끝자락인 65위를 하게 되었습니다. 수상 커트라인이 6솔이여서 아쉽네요.&lt;br /&gt;제 첫 온사이트 대회였는데, 정말 재밌었습니다. 이렇게 많은 사람들이 모인곳에서 PS라는 같은 주제로 대화하고 웃을 수 있다는게 참 좋았던 것 같습니다. 좋은 대회 만들어주신 출제/검수/운영진 분들 감사합니다!&lt;/p&gt;</description>
      <category>코딩 대회</category>
      <author>이왓슨</author>
      <guid isPermaLink="true">https://leewatson.tistory.com/126</guid>
      <comments>https://leewatson.tistory.com/126#entry126comment</comments>
      <pubDate>Sun, 17 May 2026 12:11:35 +0900</pubDate>
    </item>
    <item>
      <title>Goodbye, BOJ!</title>
      <link>https://leewatson.tistory.com/125</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;BOJ main.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C47EL/dJMcafGrmjd/tWK91NWro6oHL30P7Pcq10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C47EL/dJMcafGrmjd/tWK91NWro6oHL30P7Pcq10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C47EL/dJMcafGrmjd/tWK91NWro6oHL30P7Pcq10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC47EL%2FdJMcafGrmjd%2FtWK91NWro6oHL30P7Pcq10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1200&quot; data-filename=&quot;BOJ main.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>코딩 일지</category>
      <author>이왓슨</author>
      <guid isPermaLink="true">https://leewatson.tistory.com/125</guid>
      <comments>https://leewatson.tistory.com/125#entry125comment</comments>
      <pubDate>Wed, 29 Apr 2026 16:15:44 +0900</pubDate>
    </item>
    <item>
      <title>제6회 청소년 IT 경시대회 후기(고등부)</title>
      <link>https://leewatson.tistory.com/124</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;한국정보진흥기술원에서 주관하는 제 6회 청소년 IT 경시대회를 참가했습니다. 4문제를 3시간30분동안 푸는 대회였고, 결과적으로 &lt;b&gt;400점 만점에 220점&lt;/b&gt;을 받았습니다. 아무래도 A,B,C를 풀고 300점 이상인 사람은 꽤 있을거 같아 동상이나 장려상 정도라도 받으면 좋겠다고 생각하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;upd: 장려상을 받게 되었습니다! B를 풀지 못해서 굉장히 아쉬운 기량이였다고 생각하지만요.. 거의 턱걸이로 상을 받게 되어 감사할 따름입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1670&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/psZGW/dJMcadH4wZg/5biOPkkoGPgJqmDcVt9rwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/psZGW/dJMcadH4wZg/5biOPkkoGPgJqmDcVt9rwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/psZGW/dJMcadH4wZg/5biOPkkoGPgJqmDcVt9rwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpsZGW%2FdJMcadH4wZg%2F5biOPkkoGPgJqmDcVt9rwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1670&quot; height=&quot;310&quot; data-origin-width=&quot;1670&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A. 체스판 다시 칠하기 100/100&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 색칠된 검은색 칸들의 좌표 $(x,y)$에 대해, $x+y$의 parity가 모두 같으면 YES, 아니면 NO 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;B. 감시자 20/100&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;섭테 1은 모든 노드에 대해 $A_{i} = 1, B_{i} = 0$이기 때문에, 단순히 1번 노드에서 가는 최단시간을 출력하면 됩니다. 빠르게 20점을 긁었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후에 더 고민을 해봤는데, 섭테 2를 긁기 위해 주기성을 이용해서 bfs로 각 노드마다 가능한 시간을 갱신해주는 풀이가 떠올랐습니다. 하지만 최솟값만 갱신하면 된다는걸 간과하고 모든 $t$에 대해 가능/불가능 여부를 관리하려고 삽질하다 결국 던졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만점을 받으려면 $MOD \, 2520 = i$ 인 최솟값을 정점에서 관리하면서 다익을 돌리면 된다고 합니다. $2520 = lcm(2, \cdots ,10)$ 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;C. 로봇 청소기 100/100&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 끝까지 간 뒤 오른쪽으로 쭉 먼지를 없애는 방법과, 오른쪽으로 끝까지 간 뒤 왼쪽으로 쭉 먼지를 없애는 방법 중 더 최소인걸 고르면 됩니다. 먼지를 없앨때는, 현재 $i$번째 칸에 위치해 있을때 $i$번째 칸과 $i+1$번째 칸(오-&amp;gt;왼 인경우 $i-1$번째 칸)을 왔다갔다 하며 $a[i]=0$이 될때까지 반복하면 항상 최적입니다. 엄밀하게 증명해보진 않았고, 몇몇개의 테케를 직접 손브포해서 관찰할 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$s &amp;lt; l$인 케이스는 오-&amp;gt;왼으로 가는 방법에서 자연스럽게 커버할거라고 생각해 배제했는데, 이거때문에 50점에서 계속 맞왜틀 당해서 40분은 넘게 잡아먹었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;D. 구간과 쿼리 0/100&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;섭테 1을 긁어보려고 스위핑 비슷한 풀이를 냈습니다. 구간을 항상 시작점 기준 오름차순 정렬된 상태로 유지하면, 3번 쿼리마다 $[p,q]$에서 $p \leq l; \, r \leq q$를 만족하는 구간들에서 최대한 많은 구간을 안겹치게 선택하는걸 $O(N)$에 할 수 있습니다. 사실 원래는 끝점 기준으로 정렬하는게 정석이지만, 시작점 기준으로 해도 지금 보고있는 구간이 이전 구간의 끝점보다 일찍 끝나면 갱신해주는 방식으로 같은 효과를 낼 수 있습니다. 문제는 이렇게 낸 $O(NQ)$ 풀이가 섭테 1부터 WA를 받았다는 것 입니다. 구현 실수가 있던 것 같은데 예제는 또 잘 돌아서.. 디버깅하다가 대회가 끝났습니다. 개인적으로 굉장히 아쉽습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;친구한테 들은 정해는 세그 2개로 구간 개수하고 실제 겹치지 않는 최대 구간 개수를 각각 관리를 하는거라고 하는데, 이걸 대회중에 어떻게 생각해요..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개학하고 할 일이 산더미라 PS를 마냥 재밌게 계속할 수 만은 없던 상황이였는데, 대회 준비라는 명목으로라도 열심히 한 것에 만족합니다. 기출을 풀다보니 세그가 너무 많이 나와서 lazy seg 템플릿 까지 외우고 갔는데, 문제로 나왔음에도 써먹지를 못해서 아쉽네요.&lt;/p&gt;</description>
      <category>코딩 대회</category>
      <category>제6회 청소년 IT 경시대회</category>
      <author>이왓슨</author>
      <guid isPermaLink="true">https://leewatson.tistory.com/124</guid>
      <comments>https://leewatson.tistory.com/124#entry124comment</comments>
      <pubDate>Sat, 14 Mar 2026 21:11:00 +0900</pubDate>
    </item>
    <item>
      <title>SUAPC 2026 Winter 출제/검수 후기</title>
      <link>https://leewatson.tistory.com/123</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;0. 들어가며&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-26 오전 2.52.02.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;2106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dezWGJ/dJMcajuvTV9/qlKTpbXvnD9IrKEGyhHSAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dezWGJ/dJMcajuvTV9/qlKTpbXvnD9IrKEGyhHSAK/img.png&quot; data-alt=&quot;출제한 문제인 SUAPC E번 가지가지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dezWGJ/dJMcajuvTV9/qlKTpbXvnD9IrKEGyhHSAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdezWGJ%2FdJMcajuvTV9%2FqlKTpbXvnD9IrKEGyhHSAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2540&quot; height=&quot;2106&quot; data-filename=&quot;스크린샷 2026-02-26 오전 2.52.02.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;2106&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출제한 문제인 SUAPC E번 가지가지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한창 문제 출제/검수 조건을 달성하고 여러가지 문제를 구상하고 있을 때, SUAPC 2026 Winter의 콜포테가 열렸습니다. 3문제 정도 지원했고, 감사하게도 가장 출제하고 싶던 1문제가 선정되어 출제진으로 활동할 수 있었습니다. 동시에 출제 자격 B도 달성하고 있는 상태였기 때문에, 몇몇 문제들은 검수도 했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. '가지가지'에 대하여&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 &lt;a href=&quot;https://www.acmicpc.net/problem/34982&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;룩 vs 폰&lt;/a&gt; 문제를 출제했을 때 많은 피드백을 받았었습니다.. 그래서 좋은 문제를 구성하기 위해 더 많이 노력했던 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가지가지는 PS를 시작하고 처음으로 구상한 문제였습니다. 구상할 당시에는 해구성 없이 배치 가능 여부만 출력하는 문제였는데, N*N + N*(M-N) 으로 나누어 해구성하는 방법을 발견해내서 지금의 가지가지가 되었습니다. 하지만 에디토리얼은 다른 해구성 방법으로 설명했습니다. 검수진 분들이 더 쉬운 풀이로 풀어주셨기 때문입니다. 검수의 중요성을 다시한번 느꼈습니다. 문제가 더 잘 다듬어지고 완성되어가는 모습을 보는게 뿌듯했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-26 오전 3.26.18.png&quot; data-origin-width=&quot;2404&quot; data-origin-height=&quot;1336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8o36L/dJMcahDtrcm/dCnXbHijkmu6llUCYRZ9Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8o36L/dJMcahDtrcm/dCnXbHijkmu6llUCYRZ9Xk/img.png&quot; data-alt=&quot;에디토리얼 마지막 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8o36L/dJMcahDtrcm/dCnXbHijkmu6llUCYRZ9Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8o36L%2FdJMcahDtrcm%2FdCnXbHijkmu6llUCYRZ9Xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2404&quot; height=&quot;1336&quot; data-filename=&quot;스크린샷 2026-02-26 오전 3.26.18.png&quot; data-origin-width=&quot;2404&quot; data-origin-height=&quot;1336&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;에디토리얼 마지막 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아쉽게도 온사이트에 직접 가진 못해서, Challenge까지 해설할 수는 없었습니다. 혹시 궁금한 분이 계실까봐 짧게 정리해보았습니다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$N \times M \times K$ 격자 공간에서 모든 slice에 꼭지가 홀수개 존재해야하므로, 2차원일때와 같은 논리로 N,M,K의 parity가 모두 같아야 해구성이 가능함을 알 수 있습니다. 이는 차수가 늘어나도 항상 적용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해구성 방법 또한 비슷합니다. $N \times N \times N$을 먼저 구성합니다. $(1,1,1),(2,2,2),(3,3,3) ... (N,N,N)$에 꼭지가 오도록 구성하면, 남은 공간에서 고려해야할 부분은 $(M-N) \times (K-N)$ 크기의 격자판이 됩니다. 이후에는 기존 풀이처럼 진행하면 됩니다. 예외적으로 $3 \times 3 \times 3$은 직접 구성해야합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 문제 검수에 대하여&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대회 기준으로 A, C, D, J, K, M, PA, PB, PC, PD번을&amp;nbsp;검수했습니다. 나머지는 풀지 못했습니다. ㅠㅠ&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;A. 유림이와 하람이의 두쫀쿠 대작전&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 사칙연산 문제입니다. 두쫀쿠 원가가 2000원밖에 안된다는 진실을 알게 해줬습니다... 그리고 일러스트가 귀여워요.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;C. 숫자 놀이 3&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진법에 익숙치 않아서 살짝 고민했던 문제입니다. 1부터 역으로 추적해서 적당한 조건의 dfs를 돌며 가능한 수를 모두 찾고, 이후 정렬을 하고 앞에서부터 k개를 출력하면 됩니다. 정해는 pq로 k개 까지 관리하는거지만, dfs로 전부 찾아도 시간내에 든다는걸 증명하는 난이도를 생각하면 난이도는 비슷합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;D. Yet Another Binary Problem&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마음에 드는 문제입니다. 수열에서 1을 +1, 0을 -1로 생각하고 누적합을 해봅시다. 이후 Suffix min/max도 구해놓으면, 지금 이 쿼리를 썼을 때 남은 쿼리 개수로 이후에 나올 0/1을 모두 지울 수 있는가?를 판단할 수 있게 됩니다. 1번 쿼리는 사용시 이후 Suffix min을 1 증가시키고, 2번 쿼리는 사용시 이후 Suffix max를 1 감소 시키기 때문에 그렇습니다.&amp;nbsp;&lt;s&gt;산 깎기&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후에 누적합 안쓰고 이상한 그리디로 뚫을 수 있지 않을까 해서 여러개를 내봤는데, 전부 막혀버렸습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;J. 지하철! 지하철! 몇호선? 몇호선?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭔가 선공 필승법이 있을거 같아서 오래 고민했는데, 결국은 홀짝인 문제였습니다. n이 짝수라면 (1,2),(3,4),...(n-1,n) 이렇게 묶고 나서, 후공은 선공이 말한 수와 같은 묶음의 수를 말하기만 하면 항상 짝수개씩 소모되기 때문에 후공이 이깁니다. n이 홀수라면 선공이 1을 말하고, 선후공이 바뀐 상황에서 n이 짝수인 게임을 하게 되어 선공이 이깁니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;K. MC 히페리온&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 문제입니다. 문제를 처음 풀때는 제약 조건을 잘못 읽어서 1번 쿼리를 루트부터 타고 들어가서 $O(|S|)$에 처리하는 풀이를 냈었습니다. 근데 이후 검수노트를 보니, 정해가 트라이+ett+세그로 되어있어서 뭔가 잘못됨을 느꼈습니다. 데이터를 보니 문자열 길이를 최대로 하고 1번 쿼리 개수도 최대로 하는 데이터가 없었어서 추가했습니다. 별해로 정렬 + 이탐 레전드 똑붙 풀이가 있는데 어떻게 이런 생각을 하지&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;M. 괄호 문자열 카드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만만하게 봤다가 큰 코 다친 문제입니다. ()는 그 자체로 올바른 괄호 문자열이라 항상 배치가 가능합니다. ((, ))를 먼저 배치하고, 이후에 남은건 (, )으로 짝지어줍시다. 열고 닫는 괄호가 1쌍이라도 있다면 )(도 모두 사용할 수 있습니다. 진짜 깐깐하게 케웍을 해야해서 틀리기 너무 좋은 문제에요.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;PA. SUAPC 2025 Summer&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SUAPC의 유서깊은 스코어보드 문제입니다. 원래는 23팀 전부에 대해 구해야했었는데, 내부 조정을 거쳐 상위 10팀에 대해서만 구하는걸로 제한이 줄어들었습니다. OCR이 도입되면 편할거 같다는 생각을 했습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;PB. 선물 게임&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식정리를 간단하게 못해서 어렵게 푼 문제입니다. 우선 단순히 생각해봐도 선공이 후공보다 유리하기 때문에, 일부러 턴을 상대에게 넘기는 변칙적인 플레이는 손해임을 알 수 있습니다. i번째 열까지 진행했을 때 B가 선물을 찾을 확률을 $\frac{a_{i}}{b_{i}}$ 라고 합시다. i번째 열을 기준으로 선공이 선물을 찾을 확률은 $\frac{n- \lfloor\frac{n}{2}\rfloor}{n}$ 이란걸 이용해서 식을 정리하면, $a_{m} = a_{1} + \lfloor\frac{n}{2}\rfloor (n + n^{2} + \cdots + n^{m-1})$ 이고 $b_{m} = n^{m}$ 이 됩니다. 유클리드 호제법으로 $a_{m}$과 $b_{m}$이 서로소임을 증명할 수 있으므로, 유일하게 문제가 되는 $n + n^{2} + \cdots + n^{m-1}$ 부분만 분할정복으로 해결하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정해는 이 풀이보다 더 깔끔합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;PC. 괴수의 꽃노래&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽고 재밌는 문제입니다. &quot;매 구역에서 이전까지 본 모든 꽃 보다 꽃잎의 수가 적거나, 이전까지 본 모든 꽃 보다 꽃잎의 수가 많도록 씨앗을 심었다.&quot; 라는 조건은, 1번 구역의 번호 $A_{1}$을 기준으로 수가 커지는 경로와 작아지는 경로만 존재한다는걸 의미합니다. 즉 N번 구역에서 1번 구역을 찍고 왕복해서 돌아오면서 1부터 N까지(혹은 N부터 1까지) 차례대로 만날 수 있게 됩니다. 성대의 구조를 바꿀때 드는 비용을 최소화하려면 오름차순 or 내림차순으로 방문하는게 최적이기 때문에 이 두가지 관찰을 합치면 넉넉하게 문제를 해결할 수 있게 됩니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;PD. 멘헤라&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제한이 $10^{16}$이여야만 하는 문제입니다! N이 충분히 크면 순하리 레몬진 9도를 계속 마쳐서 취기를 빠르게 올리는게 최선임을 짐작할 수 있습니다. 적당히 작은 N은 bfs로 찾아주면 됩니다. '적당히'의 정확한 boundary를 증명하려면 어렵지만, bfs가 안터지는 선에서 최대한 많은 N을 bfs로 커버쳐주면 되겠습니다. 참고로 정확한 boundary는 60.5입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제가 제한이 $10^{16}$이여야만 하는 이유는, 검수할 때 파이썬으로 풀었다가 float 정밀도 이슈로 맞왜틀을 당한게 &lt;s&gt;괘씸&lt;/s&gt;교육적이기 때문입니다. 큰 수라고 해서 조심하지 않고 무작정 파이썬을 쓰는것에 대한 고찰을 제공하는 좋은 문제입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 마치며&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평소에도 대학에서의 PS생활을 동경하고 있었는데, 대회 이후로 더욱 동경하게 될 것 같습니다. SUAPC 흥해라~&lt;/p&gt;</description>
      <category>코딩 대회</category>
      <category>SUAPC 2026 Winter</category>
      <author>이왓슨</author>
      <guid isPermaLink="true">https://leewatson.tistory.com/123</guid>
      <comments>https://leewatson.tistory.com/123#entry123comment</comments>
      <pubDate>Thu, 26 Feb 2026 05:44:45 +0900</pubDate>
    </item>
    <item>
      <title>2025 KCPC Open Contest 후기</title>
      <link>https://leewatson.tistory.com/122</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-01-18 오전 12.54.29.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tng5r/dJMcagdbXth/FLgzMZQGfRdmHembkBk3F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tng5r/dJMcagdbXth/FLgzMZQGfRdmHembkBk3F1/img.png&quot; data-alt=&quot;예비소집 Open Contest&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tng5r/dJMcagdbXth/FLgzMZQGfRdmHembkBk3F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftng5r%2FdJMcagdbXth%2FFLgzMZQGfRdmHembkBk3F1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2540&quot; height=&quot;912&quot; data-filename=&quot;스크린샷 2026-01-18 오전 12.54.29.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예비소집 Open Contest&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-01-18 오전 12.53.06.png&quot; data-origin-width=&quot;2510&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QkD0F/dJMcabQtMfl/rH3eDqnkCTkctOCkhOwkZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QkD0F/dJMcabQtMfl/rH3eDqnkCTkctOCkhOwkZk/img.png&quot; data-alt=&quot;본 대회 Open Contest - Div. 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QkD0F/dJMcabQtMfl/rH3eDqnkCTkctOCkhOwkZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQkD0F%2FdJMcabQtMfl%2FrH3eDqnkCTkctOCkhOwkZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2510&quot; height=&quot;842&quot; data-filename=&quot;스크린샷 2026-01-18 오전 12.53.06.png&quot; data-origin-width=&quot;2510&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;본 대회 Open Contest - Div. 1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;2026년에 개최된 2025 KCPC 오픈콘입니다. 백준 대회는 계속 1솔만 하고 도망가다가 이번에는 풀타임으로 풀어봤는데, 성과가 나쁘지 않아서 다행입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;조합 문제가 많아서 슬펐습니다. 코포치면서 강제로 조합론 공부를 더 하게 됐는데, 공부를 해도 여전히 싫어요.. 조합론 멈춰&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;예비소집&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;PF번 01:53 AC&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;문제에서 구해야하는 180도 회전해도 같은 행렬을 151행렬 이라고 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;나이브하게 하면 $O(N^2M^2)$으로 안되기 때문에 발상이 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;어떤 행에서 가장 긴 151행렬을 찾는다면, 회전의 중심이 151행렬의 중심과 같은 부분 행렬들은 전부 151행렬입니다. 따라서 행을 고정하고 가장 긴 151행렬을 찾아주면 길이를 통해 개수도 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;구현은 중심행을 잡고 위아래로 확장하면서 추가된 행끼리 180도 돌려서 똑같은지 보고, 추가된 행에서 가장 긴 151행렬과 이전까지 찾았던 가장 긴 151행렬을 비교해서 min을 가져갑니다. 매내처를 발라주는게 핵심입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;0,1,2,5,8은 자기자신에 대응되고, 6,9는 서로에 대응되며, 3,4,7이 포함된 행렬은 절대 151행렬이 될 수 없으니 배제하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt; $O(N^2M)$ 정도로 문제를 해결할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;본 대회&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;A번 00:09 AC&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;하란대로 구현하면 되는 문제입니다. 보드를 굳이 배열로 만들 필요 없이 문자열 상태에서 푸는게 더 편합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;C번 00:47 AC&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;유일하게 제약이 걸린 쿼리는 P로, 큐의 크기가 0일때 P를 쓰는 경우는 전체에서 제외해야합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;dp[i]는 i번째 문자열까지 봤을때 가능한 경우의 수라고 놓고 식을 세우면 $dp[i] = dp[i-1] + dp[i-2]$가 나옵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;하지만 매번마다 큐의 크기가 0일때 P를 쓰는 경우를 계산할 필요는 없습니다. 그런 경우가 나오는건 $(i-1)$%$3$이 0일때 뿐입니다. PP가 +1이고 P가 -1이니까 0이 되기위해선 반드시 길이가 3의 배수여야 PP와 P가 매칭될 수 있어서 그렇습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;$(i-1)$%$3 == 0$ 이라면 큐의 크기가 0인 경우를 추가로 빼주면 되고, 직관으로..또는 규칙성을 보면서 그게 카탈란 수 인것도 알 수 있습니다. 저는 직관이 없어서 직접 항을 구했습니다. 카탈란인거 눈치를 너무 늦게 챈거 같아요. 식정리도 좀 더 쉽게 할 수 있었을거 같은데 아쉽습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;H번 01:03 AC&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;제목보고 거르려고 했는데 괜찮은 문제였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;n이 2라면 2번 쿼리의 결과가 모두 1이거나 모두 0일때만 가능하고, n이 3이상이면 항상 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;n이 3이상이면, 시작부터 1번 쿼리로 구간 3개를 만듭니다. 이때 1번째와 2번째 구간은 겹치게, 3번째 구간은 안겹치게 만듭니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;나머지 1번 쿼리는 아무렇게나 씁니다. 그러면 이제, 2번 쿼리의 결과가 1이라면 2 1 2를 주고, 0이라면 2 1 3을 주는 간단한 방법으로 해결할 수 있게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;n이 2라면 구간을 2개밖에 못만들기 때문에 줄 수 있는 2번 쿼리는 2 1 2 밖에 없고, 모두 1이면 두 구간을 겹치게, 모두 0이면 두 구간을 안겹치게 만들면 됩니다. 그렇지 않다면 불가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;D번 01:13 WA&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;뭔가 문제 그림이 기하 공포증을 유발해서 도망가려고 했는데, 생각보다 쉬운 케웍 문제라 바로 잡았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;아무도 D를 안풀었길래 퍼솔할 생각에 싱글벙글 하다가 C가 K를 완전히 감싸는 경우를 생각하지 않아서 WA를 받았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;D번 01:15 WA&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;급하게 고쳤는데 K의 위와 아래를 막는 방법을 생각하지 않아서 WA를 또 받았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;D번 01:17 AC&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;K+C+P가 1이면 불가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;C와 P는 다른 문자가 1개라도 있으면, 무조건 규칙을 지키게 배치할 수 있습니다. 따라서 주요한 분기는 K에 달려있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;K가 0개일때: 항상 가능합니다. CP를 짝을 이뤄서 붙이고, C가 남으면 CC...CP 처럼 붙여주면 됩니다. P는 끝점이 1개라 더 쉽습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;K가 1개일때: C가 K를 완전히 감쌀 수 있기 때문에, C가 1개 이상 있으면 항상 가능합니다. C가 0개라면, P가 적어도 2개는 있어야 가능하게 됩니다. K의 위와 아래를 P로 막아주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;K가 2개 이상일때: K를 상하방향으로 쭉 배치해서 연결하면, 맨 윗부분과 맨 아랫부분만 막아주면 된다는걸 알 수 있습니다. C+P가 2이상이면 항상 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;F번 01:48 WA&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;4솔을 하고 슼보를 보니 F가 많이 풀려있었습니다. 그래서 적당히 쉬운 문제인줄 알았는데, 속았습니다. 조합문제가 또 나와버렸습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;또 나만 모르는 웰노운으로 풀리는 그런 문제인가 하면서 지문을 읽고 보니까, 그냥 포함배제 쓰는 간단한 문제가 맞았습니다. 그래서 두번 속았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;근데 다풀고 수의 범위 $v = r-l+1$가 1이면, $v-2$가 음수라서 $max(0,v-2)$로 처리해야 하는데 안해서 WA를 받았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;식 정리한거 그대로 쓰면 되는건데 $max(0,v-1)$은 잘 해놓고 왜 안했지&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;F번 01:49 AC&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;원소로 들어갈 수 있는 숫자는 $v$개가 있습니다. 가능한 전체 경우의 수는 $v^n$ 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;여기서 l이 없는 경우가 $(v-1)^n$개, r이 없는 경우도 똑같이 $(v-1)^n$개 이고 둘다 없는 경우는 $(v-2)^n$개 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;따라서 경우의 수는 $v^n+(v-2)^n-2(v-1)^n$개 이고, 기댓값을 물어보고 있지만 결국 정렬이 성공하는 경우는 1개밖에 없어서 경우의 수랑 똑같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;J번 03:21 AC&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;5솔을 하고 슼보를 보니 J가 많이 풀려있었습니다. 그래서 적당히 쉬운 문제인줄 알았는데, 속았습니다. 조합문제가 또또 나와버렸습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;일단은 초반에 몇줄만 결정하면 이후에 자동으로 나머지 칸들이 결정된다는 관찰을 하고 나서, 이걸 전체로 확장시키려고 하다가 실패했습니다. 막 n이랑 m의 홀짝에 따라서 어쩌구 하는걸 다 썼었는데, 작은 예제는 돌고 큰 예제가 안돌아서 망했단걸 직감했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;그래서 K와 P를 어떤 관계로 배치시키는지에 중점을 두고 문제를 풀었습니다. 관찰이 좀 오래 걸렸는데, 나눈 경우는 4가지 정도이고 방향으로 보면 행 방향, 열 방향, 대각선 방향 중 하나로 K, P가 돌아가면서 나오는게 유지가 되기 때문에 이를 기반으로 식을 세울 수 있었습니다. 경우를 나누면 나눌수록 점점 헷갈려져서 KPKP KCKC PCPC KCPC PCKC 이런 배열들을 일단 다 써놓고 분류해서 정리했는데, 결과적으로는 잘한 선택인 것 같습니다. 관찰하고 케이스 정리하는게 모두 어려운 문제였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;B번 03:54 TLE&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;남은 시간동안 E번이나 I번은 못푸는게 확실했습니다. B번보다는 G번이 좀 더 재밌어보여서 먼저 G번을 관찰했는데, 점 하나가 원점에 고정되어있어서 적절히 도착점을 원점 근처로 이동시켜도 될거 같다는 생각만 들고 증명하진 못해서&amp;nbsp;&lt;span style=&quot;text-align: start;&quot;&gt;B번으로 왔습니다.&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd; text-align: start;&quot;&gt;1번 정점에 2,3,4번 정점을 연결합시다. 무거운 정점은 4개 이하여야 하므로, 2,3,4번 정점을 전부 무거운 정점으로 만들어도 조건은 만족합니다. 2번 정점에 a개의 정점을 연결하고, 마찬가지로 3번 정점에 b개, 4번 정점에 c개를 연결하면 트리의 지름 개수는 $ab+bc+ca$가 됩니다. 이제 $ab+bc+ca = N$을 만족하는 a,b,c를 찾으면 됩니다. 근데 문제는 어떻게 찾느냐 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd; text-align: start;&quot;&gt;가장 먼저 떠오르는 방법은 브루트포스로 찾는거였습니다. N 제한이 $10^{11}$ 이였지만 a를 고정시켜놓고 찾으면 빠르게 돌릴 수 있어서 시간내에 돌아간다고 생각했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd; text-align: start;&quot;&gt;당연히 아니였습니다! 예를 들어 $a = 1$ 일때 나오는 식인 $bc+b+c=N$ 을 변형하면 $(b+1)(c+1)=N+1$이 되기 때문에 단순히 $N+1$이 소수면 $O(N)$이 되어서 시간초과를 받게 됩니다. 나중에 다른 분 풀이를 보니 탐색을 $\sqrt{N+1}$부터 하니까 AC를 받았다고 하는데, 왜 도는지 증명도 모르겠고 그냥 고능하지 못했던 거 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd; text-align: start;&quot;&gt;이와는 별개로 시복 문제를 해결하기 위해 랜덤을 사용하는 풀이도 된다고 하는데, 저는 랜덤도 안떠오르고 결정론적 방법도 말아먹어서 여기서 손을 놨습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 대회</category>
      <author>이왓슨</author>
      <guid isPermaLink="true">https://leewatson.tistory.com/122</guid>
      <comments>https://leewatson.tistory.com/122#entry122comment</comments>
      <pubDate>Sun, 18 Jan 2026 03:38:20 +0900</pubDate>
    </item>
    <item>
      <title>2025를 돌아보며</title>
      <link>https://leewatson.tistory.com/121</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2025년은 내 인생에서 가장 바쁘게 보낸 한 해이다. 동시에 가장 많은 성장을 한 해이기도 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PS는 올해 가장 급진적인 성장을 이룬 분야중에 하나이다. 그리고 인터넷의 특성답게 여기저기에 매우 잘 보존되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-12-31 오후 11.04.00.png&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1988&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nTWJY/dJMcaf6jLH6/TYMtjYlb8B7gqyAJEh95j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nTWJY/dJMcaf6jLH6/TYMtjYlb8B7gqyAJEh95j1/img.png&quot; data-alt=&quot;2025-12-31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nTWJY/dJMcaf6jLH6/TYMtjYlb8B7gqyAJEh95j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnTWJY%2FdJMcaf6jLH6%2FTYMtjYlb8B7gqyAJEh95j1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2628&quot; height=&quot;1988&quot; data-filename=&quot;스크린샷 2025-12-31 오후 11.04.00.png&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1988&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2025-12-31&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 솔브드 다이아1을 찍었다. 기억상 작년 연말에 플레4 정도 였던거 같은데, 대단한 발전이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과학고에서 PS하는 친구도 만나서 학교에 PS를 전파할 수 있었다. 내년에는 학교 최초로 PS동아리도 개설한다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-12-31 오후 11.09.37.png&quot; data-origin-width=&quot;2402&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjjvZm/dJMcaaRtLsY/6TGtEbwBHv4Tx601FbA1R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjjvZm/dJMcaaRtLsY/6TGtEbwBHv4Tx601FbA1R0/img.png&quot; data-alt=&quot;365 - 6&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjjvZm/dJMcaaRtLsY/6TGtEbwBHv4Tx601FbA1R0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjjvZm%2FdJMcaaRtLsY%2F6TGtEbwBHv4Tx601FbA1R0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2402&quot; height=&quot;810&quot; data-filename=&quot;스크린샷 2025-12-31 오후 11.09.37.png&quot; data-origin-width=&quot;2402&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;365 - 6&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스트릭은 아쉽게 6일정도 빼먹었다. 미국 시차를 생각하지 않아서 스트릭 잇는 시각을 잘못 계산한게 아쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-12-31 오후 11.21.06.png&quot; data-origin-width=&quot;1798&quot; data-origin-height=&quot;1764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SGjyD/dJMcaacRVCU/YA3XNpmTxCg2xgW6sLZmWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SGjyD/dJMcaacRVCU/YA3XNpmTxCg2xgW6sLZmWK/img.png&quot; data-alt=&quot;Codeforces&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SGjyD/dJMcaacRVCU/YA3XNpmTxCg2xgW6sLZmWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSGjyD%2FdJMcaacRVCU%2FYA3XNpmTxCg2xgW6sLZmWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1798&quot; height=&quot;1764&quot; data-filename=&quot;스크린샷 2025-12-31 오후 11.21.06.png&quot; data-origin-width=&quot;1798&quot; data-origin-height=&quot;1764&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Codeforces&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코포도 발전이 많다. 연말에는 거의 상승곡선이라 퍼플을 뚫어버릴거 같았는데.. 아직 그정도 실력은 아닌가보다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어째서인지 모르겠지만 시험기간만 되면 코포 레이팅이 오른다. 시험 점수를 재물로 바쳐서 레이팅을 얻는.. 이상한 징크스다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-12-31 오후 11.25.38.png&quot; data-origin-width=&quot;2370&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w44Zt/dJMcacBLc7v/7R7lT52L9fad2h3VbjACAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w44Zt/dJMcacBLc7v/7R7lT52L9fad2h3VbjACAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w44Zt/dJMcacBLc7v/7R7lT52L9fad2h3VbjACAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw44Zt%2FdJMcacBLc7v%2F7R7lT52L9fad2h3VbjACAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2370&quot; height=&quot;526&quot; data-filename=&quot;스크린샷 2025-12-31 오후 11.25.38.png&quot; data-origin-width=&quot;2370&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코포 퍼플을 찍고, 푼 문제수도 1000문제를 넘어가며 문제 출제가 가능해졌다. 감사하게도 '룩 vs 폰' 문제가 코더즈 코딩페어 문제로 선정되어서, 첫 대회 운영, 문제 출제와 동시에 백준에 내 문제가 올라가는 귀한 경험을 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'룩 vs 폰'은 &lt;a href=&quot;https://www.acmicpc.net/problem/21251&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;[백준 21251] Premove Checkmate&lt;/a&gt; 이 문제에서 영감을 받아서 만들어졌다. 그래서 상당히 유사한 면이 많은데, 예를 들면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;체스 테마이고, 기존 체스 룰이 아닌 특수한 룰을 적용한다.&lt;/li&gt;
&lt;li&gt;매우 많은 경우의 수를 봐야한다.&lt;/li&gt;
&lt;li&gt;발상이 어렵다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;체스를 알면 체감 난이도가 낮아진다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 마지막 특징 때문에 이 문제는 욕을 많이 먹었다. 체스를 아는지 모르는지에 따라 이 문제에 들이는 시간과 노력이 천지차이라서 체감 난이도 또한 달라지게 되기 때문이다. 대회중에는 그 점이 더욱 더 부각되었기도 하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-12-31 오후 11.47.24.png&quot; data-origin-width=&quot;2370&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bslIIN/dJMcagxnFdl/6d2dwKkoTCnPZYcfRRMMA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bslIIN/dJMcagxnFdl/6d2dwKkoTCnPZYcfRRMMA0/img.png&quot; data-alt=&quot;대회 기준 I번 문제였던 '룩 vs 폰'은 정답률 15.172%로 전체 문제에서 가장 낮았다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bslIIN/dJMcagxnFdl/6d2dwKkoTCnPZYcfRRMMA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbslIIN%2FdJMcagxnFdl%2F6d2dwKkoTCnPZYcfRRMMA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2370&quot; height=&quot;648&quot; data-filename=&quot;스크린샷 2025-12-31 오후 11.47.24.png&quot; data-origin-width=&quot;2370&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;대회 기준 I번 문제였던 '룩 vs 폰'은 정답률 15.172%로 전체 문제에서 가장 낮았다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참가자 분들에게 불유쾌한 경험을 제공한것에 대해 반성하고 있다. 앞으로 문제 출제를 할때는 이 경험을 본보기 삼아 양질의 문제를 만들기 위해 더 신경써야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그동안 이룬 결실도, 못다 한 각오도 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026에는 더 성장하는 한 해가 되었으면 좋겠다.&lt;/p&gt;</description>
      <category>코딩 일지</category>
      <author>이왓슨</author>
      <guid isPermaLink="true">https://leewatson.tistory.com/121</guid>
      <comments>https://leewatson.tistory.com/121#entry121comment</comments>
      <pubDate>Wed, 31 Dec 2025 23:59:17 +0900</pubDate>
    </item>
    <item>
      <title>일차 선형 점화식에서의 일반항과 합 유도</title>
      <link>https://leewatson.tistory.com/120</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 평소에 보는 대부분의 수열은 계차수열이거나, 일차 선형 점화식으로 유도된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 중 일차 선형 점화식은 $a_{n+1} = r a_n + d \quad (r \neq 1, d \neq 0)$ 꼴을 의미한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반항을 유도하기 위한 아이디어는 $a_{n+1} + k = r(a_n + k)$를 만족하는 k를 찾는 것이다. 즉, 수열 $a$를 $k$만큼 평행이동 시켜서 새로운 등비 수열 $a_n + k$ 를 만드는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;준 식을 전개시켜 원래 식과 비교하면 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$a_{n+1}&amp;nbsp;=&amp;nbsp;r&amp;nbsp;a_n&amp;nbsp;+&amp;nbsp;rk&amp;nbsp;-&amp;nbsp;k&amp;nbsp;\\&lt;br /&gt;a_{n+1} = r a_n + k(r - 1)$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 $k$에 대해 정리하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$k = \frac{d}{r - 1}$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 새로운 등비 수열 $a_n + k$에 대해 등비수열의 일반항 공식 $a_n + k = (a_1 + k) r^{n-1}$ 가 성립하고, $a_n$에 대해 정리하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$a_n = (a_1 + k) r^{n-1} - k$ 라는 결과를 얻는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 $a_n + k$가 등비 수열 이므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\frac{a_n + k}{a_1 + k} = r^{n-1}$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라는 이쁜 공식을 얻을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서 합도 유도해보자. $n$번째 항까지의 합을 $S_n$ 이라고 하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$S_n = \sum_{i=1}^{n} a_i = \sum_{i=1}^{n} \left\{ (a_1 + k) r^{i-1} - k \right\}$ 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시그마 안의 식을 $(a_1 + k) r^{i-1}$과 $k$로 분리하면, $(a_1 + k) r^{i-1}$에서 $a_1 + k$은 상수이므로 $r^{i-1}$에 대해 등비수열의 합 공식이 성립한다. 이렇게 식을 정리하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$S_n = (a_1 + k) \left( \frac{r^n - 1}{r - 1} \right) - nk$ 라는 결과를 얻는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 또한 식을 이쁘게 정리하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\frac{S_n + nk}{a_1 + k} = \frac{r^n - 1}{r - 1}$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라는 공식을 얻을 수 있다.&lt;/p&gt;</description>
      <category>수학</category>
      <author>이왓슨</author>
      <guid isPermaLink="true">https://leewatson.tistory.com/120</guid>
      <comments>https://leewatson.tistory.com/120#entry120comment</comments>
      <pubDate>Thu, 4 Dec 2025 20:14:33 +0900</pubDate>
    </item>
    <item>
      <title>Codeforces Round 1064 (Div. 2)</title>
      <link>https://leewatson.tistory.com/119</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-11-20 오전 8.56.54.png&quot; data-origin-width=&quot;1876&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFyVFZ/dJMcadAmtOX/HoRlchiK90vzvpZ8SVXBnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFyVFZ/dJMcadAmtOX/HoRlchiK90vzvpZ8SVXBnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFyVFZ/dJMcadAmtOX/HoRlchiK90vzvpZ8SVXBnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFyVFZ%2FdJMcadAmtOX%2FHoRlchiK90vzvpZ8SVXBnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1876&quot; height=&quot;78&quot; data-filename=&quot;스크린샷 2025-11-20 오전 8.56.54.png&quot; data-origin-width=&quot;1876&quot; data-origin-height=&quot;78&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-11-20 오전 9.04.38.png&quot; data-origin-width=&quot;1666&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/di2e75/dJMcahJAi83/qF48XFvZNmkMidQlcsK4EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/di2e75/dJMcahJAi83/qF48XFvZNmkMidQlcsK4EK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/di2e75/dJMcahJAi83/qF48XFvZNmkMidQlcsK4EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdi2e75%2FdJMcahJAi83%2FqF48XFvZNmkMidQlcsK4EK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1666&quot; height=&quot;116&quot; data-filename=&quot;스크린샷 2025-11-20 오전 9.04.38.png&quot; data-origin-width=&quot;1666&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;퍼플을 달성했다. 블루를 달성한게 8월이였으니 3달만이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 조합을 진짜 싫어하기때문에 C까지 풀고 D를 보자마자 바로 건너뛰었는데, 그렇게 마주한 E가 체감상 D보다 쉬워서 최고 등수를 찍을 수 있었던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A 00:03 AC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 문자열에서 안바뀌는 문자는 마지막 문자밖에 없기 때문에, 모든 문자는 마지막 문자로 통일되어야 할것이다. 마지막 문자와 다른 문자의 갯수만 세주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B 00:11 AC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a == b 일때 답이 1인게 자명하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n &amp;lt;= a//b 라면 모든 위치가 화면 안에 있기 때문에 답이 1이고, 그렇지 않으면 탭을 닫을 때 위치가 바뀌니까 답은 2이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C 00:17 AC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;합치는 연산을 하면, 인접한 두 값중에 큰 값만 남기 때문에 cost를 최소로 하려면 가장 큰 값을 마지막까지 남겨야한다. 다시 말하면, 모든 인접한 두 값에 대해 합치는 연산을 해서 cost를 계산하고, 가장 큰 값에 해당하는 비용만 빼주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;E 00:42 AC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;D가 조합 문제라서 보자마자 넘기고 E로 왔다. 역시 코드포스 답게 그리디 냄새가 나는 비트연산 문제였는데, 나름 비트연산에 강하다고 생각했기 때문에 자신감있게 바로 풀이를 구상해볼 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 비트 k 마다 2^k 뭉탱이를 만들어야한다고 생각할 수 있고 이걸 충당할 수 있는건 그때까지 안 쓴 원소들이나, 쓰고 남은 부분들일것이다. 따라서 어떤 조각 v에 대해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v &amp;gt;= 2^k 이면 그걸 사용하고, 남은 v - 2^k는 나중에 더 낮은 비트에서 재사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v &amp;lt; 2^k 이면 2^k - v 만큼 비용을 들여서 a를 올려줘야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러니 v가 커질수록 들어가는 비용이 줄어들고, 결론적으로 항상 큰 거 부터 쓰는게 최적이라는걸 이끌어낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 생각하고 바로 구현에 들어갔고, 구현 자체는 그리 어렵지는 않았기 때문에 예제 돌아가는거 보고 바로 제출해서 AC를 받을 수 있었다. 나중에 에디토리얼을 보고 깨달은건데, 작은 값 두개를 사용해서 대체하는건 왜 최적이 안되는지도 관찰이 필요했었다. 풀때는 아예 저런 생각자체를 못했어서 오히려 빨리 풀렸나 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;D 01:26 AC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유구한 역사와 전통을 지닌 조합 문제는 언제나 풀기 싫은 문제였다. 이런 조합 문제들은 사고 흐름 과정이 비직관적이라고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;30분동안 별 생각 다하다가 결국 dp[i] = 'S에 속한 원소들의 a에서의 개수의 합이 i인 경우의 수' 로 놓고 풀었다. 풀고보면 정리된 식은 간단한데 그 식을 얻으려고 온몸비틀기를 해야하는게 참.. &lt;s&gt;이래서 조합 문제가 싫어&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지 아이디어는 에디토리얼과 같아서 생략한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특이하게도 이번 라운드는 A, B, C, D번 문제는 hack이 없고 프리텟이 시스텟하고 똑같았다. 그래서 사실상 이미 4솔은 확정이고, 같은 room에 E번을 푼 사람이 없어서 이 시점에서 퍼플로 승급한다는걸 확신했다. 모든 상황이 잘 갖춰지고 운까지 따라줘서 이렇게 하이커리어를 찍었다고 생각하지만, 퍼플에 주차해놓지는 않을것이다. 이정도 기량을 내 실력으로 만들어야 더 높게 등반할 수 있을테니..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 대회</category>
      <category>Codeforces</category>
      <category>Codeforces Round 1064 (Div. 2)</category>
      <author>이왓슨</author>
      <guid isPermaLink="true">https://leewatson.tistory.com/119</guid>
      <comments>https://leewatson.tistory.com/119#entry119comment</comments>
      <pubDate>Fri, 21 Nov 2025 01:30:08 +0900</pubDate>
    </item>
    <item>
      <title>[백준 33562] shapex</title>
      <link>https://leewatson.tistory.com/118</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;티어: 플5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;https://leewatson.tistory.com/82&quot; href=&quot;https://leewatson.tistory.com/82&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;제 2회 유틸컵&lt;/a&gt; 당시 7솔 배경을 눈앞에 두고 막힌 통곡의 벽 같은 문제를 드디어 풀었다. 풀고 보니 대회때도 충분히 풀 수 있었을 것 같은데.. 아쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결합기를 제외한 나머지 기계는 상대적으로 구현이 쉽다. 결합기를 어떻게 만들어야할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대회 당시 코드를 보니 결합기를 실제로 시뮬레이션 하려고 매우 길고 복잡한 casework를 했었었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 경우의 수는 그리 많치 않은데, 몇칸 결합될 수 있는지만 알면 되기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 도형을 a, a위에서 아래로 내려가며 결합할 도형을 b라고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 도형을 실제 높이에 상관없이 빈 줄을 추가해 4줄로 맞춰준다면 구현이 편리해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결합기의 역할은 a와 b가 겹치지 않는 선에서 최대한 b를 내려주는것이고, 각 경우에 대해 고려해야하는 모든것을 적어보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i. 1줄을 내리려면 a의 4층과 b의 1층이 안겹치면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ii. 2줄을 내리려면 i조건에 추가로 a의 3층과 b의 1층이 안겹쳐야 하고, a의 4층과 b의 2층이 안겹쳐야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iii. 3줄을 내리려면 ii조건에 추가로 a의 2층과 b의 1층이 안겹쳐야 하고...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iiii. 4줄을 내리려면 iii조건에 추가로 a의 1층과 b의 1층이...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것만 처리해주면 결합기와 같은 역할을 해줄 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1759027498394&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var input = require('fs').readFileSync(0,'utf8').trim().split('\n')
var [n, m] = input[0].split(' ').map(Number)
var r = [...Array(101)].map(e =&amp;gt; 0)
var color = ['r', 'g', 'b', 'y', 'p', 'c', 'w', 'u']

function J(i,j,k) { //절단기
    if(r[i] == 0) {
        r[j] = 0
        r[k] = 0
    }else {
        var s = r[i].split(':')
        r[j] = s.map(e =&amp;gt; '----' + e.slice(4)).filter(e =&amp;gt; e != '--------').join(':')
        r[k] = s.map(e =&amp;gt; e.slice(0,4) + '----').filter(e =&amp;gt; e != '--------').join(':')
        if(r[j] === '') r[j] = 0
        else if(r[k] === '') r[k] = 0
    }

}

function H(i,j,k) { //회전기
    if(r[i] == 0) r[j] = 0
    else if(k == 1) {
        r[j] = r[i].split(':').map(e =&amp;gt; e.slice(-2) + e.slice(0, -2)).join(':')
    }else if(k == 2) {
        r[j] = r[i].split(':').map(e =&amp;gt; e.slice(4) + e.slice(0, 4)).join(':')
    }else {
        r[j] = r[i].split(':').map(e =&amp;gt; e.slice(2) + e.slice(0, 2)).join(':')
    }
}

function G(i, j, k) { //결합기
    if(r[i] == 0 || r[j] == 0) {
        r[k] = 0
        return
    }
    var a = r[i].split(':')
    a.push('--------')
    a.push('--------')
    a.push('--------')
    a.push('--------')
    var b = r[j].split(':')
    b.push('--------')
    b.push('--------')
    b.push('--------')
    b.push('--------')
    a = a.slice(0,4)
    b = b.slice(0,4)
    var dab = a
    var deep = 0
    /*
    a3과 b0
    a2와 b0, a3과 b1
    a1과 b0, a2와 b1, a3와 b2
    a0와 b0, a1와 b1, a2와 b2, a3와 b3
    */
    if(GG(a[3],b[0])) {
        deep++
        if(GG(a[2],b[0])&amp;amp;&amp;amp;GG(a[3],b[1])) {
            deep++
            if(GG(a[1],b[0])&amp;amp;&amp;amp;GG(a[2],b[1])&amp;amp;&amp;amp;GG(a[3],b[2])) {
                deep++
                if(GG(a[0],b[0])&amp;amp;&amp;amp;GG(a[1],b[1])&amp;amp;&amp;amp;GG(a[2],b[2])&amp;amp;&amp;amp;GG(a[3],b[3]))
                    deep++
            }
        }
    }
    switch(deep) {
        case 1:
            dab[3] = GH(a[3],b[0])
            break
        case 2:
            dab[2] = GH(a[2],b[0])
            dab[3] = GH(a[3],b[1])
            break
        case 3:
            dab[1] = GH(a[1],b[0])
            dab[2] = GH(a[2],b[1])
            dab[3] = GH(a[3],b[2])
            break
        case 4:
            dab[0] = GH(a[0],b[0])
            dab[1] = GH(a[1],b[1])
            dab[2] = GH(a[2],b[2])
            dab[3] = GH(a[3],b[3])
            break
    }
    dab = dab.filter(e=&amp;gt;e!='--------')
    r[k]=dab.join(':')||0
}

function GG(s1,s2) { //층 결합 가능 여부 판단
    for(var i = 0; i &amp;lt; 8; i++) {
        if(s1[i]!='-'&amp;amp;&amp;amp;s2[i]!='-') return false
    }
    return true
}

function GH(s1,s2) { //층 결합
    var C = ''
    for(var i = 0; i &amp;lt; 8; i++) C+=s1[i]!='-'?s1[i]:s2[i]
    return C
}

function S(i,j,k) { //색칠기
    if(r[i] == 0) r[j] = 0
    else r[j] = r[i].replace(new RegExp(color.join('|'), 'g'), k)
}

for(var i = 1; i &amp;lt;= n; i++) r[i] = input[i]
for(var i = n+1; i &amp;lt;= n+m; i++) {
    var q = input[i].split(' ')
    switch (+q[0]) {
        case 1:
            J(+q[1],+q[2],+q[3])
            break
        case 2:
            H(+q[1],+q[2],+q[3])
            break
        case 3:
            G(+q[1],+q[2],+q[3])
            break
        case 4:
            S(+q[1],+q[2],q[3])
            break
    }
}

console.log(r[100]==0?'None':r[100])
//console.log(r.join('\n'))&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PS 풀이</category>
      <category>33562</category>
      <category>shapex</category>
      <category>백준 33562</category>
      <author>이왓슨</author>
      <guid isPermaLink="true">https://leewatson.tistory.com/118</guid>
      <comments>https://leewatson.tistory.com/118#entry118comment</comments>
      <pubDate>Sun, 28 Sep 2025 11:47:49 +0900</pubDate>
    </item>
    <item>
      <title>[백준 27904] 키파-틱택토</title>
      <link>https://leewatson.tistory.com/117</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;티어: 다1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제의 가장 큰 특징이라면, 키파-틱택토의 규칙이 무려 1시간에 달하는 유튜브 영상으로, 심지어 음성으로 제공된다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다고 1시간중 일부만 들어도 되는것도 아니다. 1시간동안 쉼 없이 n행 m열에 대한 조건이 주어지고 그게 맞는지 아닌지에 따라서 누가 이기는지 정해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 이 규칙들을 어떻게든 텍스트로 바꿔야, 이를 코드로 짤 수 있을것이다. 1시간동안 단 1개의 조건도 놓치지 않고 들어서 적는건 너무 힘들다. 다행히도 좋은 STT(Speech to Text) 라이브러리가 많고 유튜브 자막도 충분히 훌륭하게 역할을 수행해내기 때문에, 이것들을 복사 붙여넣기 하는것으로 1시간을 아낄 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 자연어로 이루어진 조건들을, 어떻게든 코드로 바꿔야한다. 나는 이런 방법을 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, 조건 문장을 분석해보자. 모든 문장의 첫 단어는 '만일', '아니고', '아니라면' 이렇게 3가지 형태중 하나이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각 if, else if, else에 대응시킬 수 있다. 또한 '아니라면' 뒤에는 '~가 이겼습니다'가 반드시 온다는 사실도 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문장의 끝 단어를 보면, '라면', '이겼습니다' 이렇게 2가지 형태중 하나이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'라면'이 문장의 끝으로 오는 경우 그 문장의 첫 단어는 '만일' 혹은 '아니고' 이다. 그리고 두 단어 사이에 조건이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'이겼습니다'가 문장의 끝으로 오는 경우, '이겼습니다' 바로 앞 단어가 '라면' 혹은 '아니라면' 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 '이겼습니다'의 경우 그 뒤에 더이상 부속 조건이 없기 때문에, '이겼습니다'가 나오기 전까지 나온 선행 조건들을 만족시킬 때 ~가 이긴다는 것으로 해석할 수 있다. 뒤에 더이상 부속 조건이 없다는 것에서 return의 사용가능성을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 규칙을 통해 공백이나 문장부호 없이 정제된 텍스트에서 아래와 같은 규칙으로 '모두 바꾸기' 기능을 사용해 조건문을 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;만일: if(board[&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;아니고: else if(board[&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;아니라면: else { return&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;행: ][&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;열이: ]==&quot;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;O라면: O&quot;) {&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;X라면: X&quot;) {&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;O가이겼습니다: &quot;O&quot; }&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;X가이겼습니다: &quot;X&quot; }&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보드판의 상태를 나타내는 1-based 2차원 배열 board를 인자로 가지는 함수 check를 만들어서 저 조건문들을 넣으면 보드판에 모든 칸이 채워져있는 경우인 서브태스크 2를 맞을 수 있다. 보드판에 빈칸이 없기 때문에 'HAVANA WINS'와 'KIPA WINS' 중에만 선택하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브태스크 3부터는 매우 힘들어진다. 보드판이 아직 다 채워지지 않은 경우에 '승리 선언'을 할 수 있는지 검사하기 위해 모든 경우에 대해 승리하는 사람이 정해져있는지 체크해야하기 때문이다. 에디토리얼을 봐도 이해가 쉽지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AC를 받기 위해선 올바른 출력을 하면서 동시에, 코드의 길이가 2023바이트 이하여야 한다. 에디토리얼에서는 조건문들을 python에서 zlib등으로 압축해 저장하는 방법을 별해로 제시하고 있지만 python이 아니라면 이것도 쉽지 않을것이다. 따라서 AC를 받으려면 서브태스크 5의 정해를 따라가야 한다고 판단해 이를 구현했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정해에서는 보드의 각 칸에 점수가 존재하며 게임의 승패는 이 점수의 총합으로 결정된다고 가정하면, 조건들을 통해 이 점수들을 실제로 알아낼 수 있다고 말하고 있다. 또한 에디토리얼을 계속 읽다보면 이 점수가 1에서 32사이의 서로다른 정수 16개로 이루어져있다는 사실도 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python의 linprog 라이브러리를 사용하면 선형계획법 코드를 쉽게 짤 수 있다. 이것을 사용해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, 앞서 만든 check함수에 가능한 모든 완성된 보드판을 넣어서 그때의 결과를 저장한다. 경우의 수는 16C8 = 12870개로 그리 많지는 않다. 이제 모든 보드판과 결과에 대해, 아래 작업을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16차원 벡터 c를 만든다. 보드판을 가로로 읽어 읽은 순서대로 다시 재배열하면 길이가 16인 문자열로 바꿀 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제, 이 문자열에 대해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- i번째 칸을 KIPA가 가져갔다면 c[i] = 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- i번째 칸을 HAVANA가 가져갔다면 c[i] = -1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 완성된 c[i]를 A배열에 저장하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 우리가 구하려는 실제 i번째 칸의 점수를 w[i]라고 하자. KIPA가 이긴경우 수식은 다음과 같아야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\sum_{i=0}^{15} c_i \cdot w_i &amp;gt; 0$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HAVANA가 이긴경우는 다음과 같아야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\sum_{i=0}^{15} c_i \cdot w_i &amp;lt; 0$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 선형계획법에서 조건에 있는 부등식은 항상 등호를 포함해야한다. 부등호의 방향이 다르면 불편하기에 통일해주는것이 좋다. 다행히도 각 칸의 점수를 정수로 표현할 수 있다고 했기 때문에, 다음과 같이 식을 변형할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$-\sum_{i=0}^{15} c_i \cdot w_i \leq -1$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\sum_{i=0}^{15} c_i \cdot w_i \leq -1$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 문제는 다음과 같이 정의할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$A_i&amp;nbsp;=&lt;br /&gt;\begin{cases}&lt;br /&gt;- c_i &amp;amp; \text{if KIPA wins on board } i \\&lt;br /&gt;\;\;\;c_i &amp;amp; \text{if HAVANA wins on board } i&lt;br /&gt;\end{cases}$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$b_i = -1 \quad \text{(Always)}$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$So,$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$A&amp;nbsp;=&lt;br /&gt;\begin{bmatrix}&lt;br /&gt;- c^{(1)} \\&lt;br /&gt;c^{(2)} \\&lt;br /&gt;\vdots&amp;nbsp;\\&lt;br /&gt;- c^{(n)}&lt;br /&gt;\end{bmatrix},&lt;br /&gt;\quad&lt;br /&gt;b&amp;nbsp;=&lt;br /&gt;\begin{bmatrix}&lt;br /&gt;-1&amp;nbsp;\\&lt;br /&gt;-1&amp;nbsp;\\&lt;br /&gt;\vdots&amp;nbsp;\\&lt;br /&gt;-1&lt;br /&gt;\end{bmatrix}$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\text{Find } w \in \mathbb{R}^{16} \text{ such that:}$&lt;br /&gt;$A \cdot w \leq b$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$1&amp;nbsp;\leq&amp;nbsp;w_i&amp;nbsp;\leq&amp;nbsp;32&amp;nbsp;\quad&amp;nbsp;\text{for&amp;nbsp;}&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0,&amp;nbsp;1,&amp;nbsp;\ldots,&amp;nbsp;15$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅤ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식으로 보면 많이 복잡해보이지만, 앞서 말한 linprog 라이브러리를 사용하면 매우 쉽게 구현할 수 있다. 아래는 예시 코드이다.&lt;/p&gt;
&lt;pre id=&quot;code_1756999326162&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solve(A,b):
    res=linprog(
        c=np.zeros(16),
        A_ub=A,
        b_ub=b,
        bounds=[(1,32)]*16,
        method='highs'
    )
    if res.success:
        return res.x
    else:
        raise RuntimeError(&quot;망했어요&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 마침내 각 칸에 있는 점수를 알 수 있다. bounds를 1부터 32로 제한했기 때문에, 에디토리얼에서 말한 1부터 32사이의 서로 다른 정수 16개가 정확히 점수로 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이를 알게 되었으니, '승리 선언' 여부와 실제 승/패를 판단하는 것은 지금까지에 비하면 매우 쉽다.&lt;/p&gt;
&lt;pre id=&quot;code_1757000301173&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var [t,...s] = require('fs').readFileSync(0,'utf8').trim().split('\n')
s = s.map(e=&amp;gt;e.split('').map(f=&amp;gt;f=='X'?1:f=='.'?0:-1)) //미리 작업

function hab(v,a,b) {
    var c = 0
    for(var i = a; i &amp;lt;= b; i++) c+= v[i]
    return c
}
/*
각 칸의 점수를 jumsu 배열에 저장해 사용
jumsu 배열은 32C16(10^22)개의 경우의 수가 존재하므로 브루트포스는 의미가 없다.
*/
var jumsu = [ //검열됨
    [0,0,0,0],
    [0,0,0,0],
    [0,0,0,0],
    [0,0,0,0]
]
var dab = ''

var havana = 0 //HAVANA의 점수
var havanac = 0 //HAVANA가 지금까지 놓은 개수
var kipa = 0 //KIPA의 점수
var kipac = 0 //KIPA가 지금까지 놓은 개수
var turn = 0 //현재 턴
var bincan = [] //빈칸들의 점수를 저장

for(var i = 0; i &amp;lt; t; i++) {
    havana = 0
    havanac = 0
    kipa = 0
    kipac = 0
    bincan = []
    for(var k = 0; k &amp;lt; 4; k++) {
        for(var j = 0; j &amp;lt; 4; j++) {
            if(s[i*4+k][j] &amp;lt; 0) {
                havana += jumsu[k][j]
                havanac++
            }else if(s[i*4+k][j] &amp;gt; 0) {
                kipa += jumsu[k][j]
                kipac++
            }else {
                bincan.push(jumsu[k][j])
            }
        }
    }
    if(havanac + kipac == 16) { //모든 칸이 채워져있으면 바로 점수로 승리 판별
        dab += (havana&amp;gt;kipa?'HAVANA WINS\n':'KIPA WINS\n')
        continue
    }
    bincan.sort((a,b)=&amp;gt;a-b)
    //HAVANA가 가장 점수가 작은칸들만 가져가도 KIPA보다 점수가 높다면 승리 선언
    if(havana + hab(bincan,0,7-havanac) &amp;gt; kipa + hab(bincan,8-havanac,15-havanac-kipac)) {
        dab += 'HAVANA DECLARES A WIN\n'
        continue
    }
    //KIPA가 가장 점수가 작은칸들만 가져가도 HAVANA보다 점수가 높다면 승리 선언
    if(kipa + hab(bincan,0,7-kipac) &amp;gt; havana + hab(bincan,8-kipac,15-havanac-kipac)) {
        dab += 'KIPA DECLARES A WIN\n'
        continue
    }
    bincan.sort((a,b)=&amp;gt;b-a)
    turn = havanac &amp;lt;= kipac ? 1 : 0
    bincan.forEach(e=&amp;gt;{ //번갈아 가면서 점수가 높은 칸 부터 차지
        if(turn) havana+=e
        else kipa+=e
        turn = 1-turn
    })
    dab += (havana&amp;gt;kipa?'HAVANA WINS\n':'KIPA WINS\n') //최종 점수로 승리 판별
}

console.log(dab)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PS 풀이</category>
      <category>27904</category>
      <category>BOJ 27904</category>
      <category>백준 27904</category>
      <category>키파 틱택토</category>
      <category>키파-틱택토</category>
      <author>이왓슨</author>
      <guid isPermaLink="true">https://leewatson.tistory.com/117</guid>
      <comments>https://leewatson.tistory.com/117#entry117comment</comments>
      <pubDate>Fri, 5 Sep 2025 00:01:20 +0900</pubDate>
    </item>
  </channel>
</rss>