<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://blog.queuedlab.com/</id>
    <title>queuedlab</title>
    <updated>2025-11-12T12:49:09.956Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <author>
        <name>queuedlab</name>
    </author>
    <link rel="alternate" href="https://blog.queuedlab.com/"/>
    <link rel="self" href="https://blog.queuedlab.com/feed.xml"/>
    <subtitle>Dongkyu Han's blog</subtitle>
    <logo>https://blog.queuedlab.com/preview.png</logo>
    <icon>https://blog.queuedlab.com/favicon.ico</icon>
    <rights>© queued (Dongkyu Han)</rights>
    <entry>
        <title type="html"><![CDATA[IPP 42 Tokyo — (2)]]></title>
        <id>https://blog.queuedlab.com/posts/ipp-42-tokyo-2-en</id>
        <link href="https://blog.queuedlab.com/posts/ipp-42-tokyo-2-en"/>
        <updated>2025-11-12T11:48:44.207Z</updated>
        <summary type="html"><![CDATA[Final day of my first IPP begins: Puzzle Party, Lectures, and Awards Dinner.]]></summary>
        <content type="html"><![CDATA[<link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/d797906b98c85a7153aa4e38b424961310e7f60e-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/d797906b98c85a7153aa4e38b424961310e7f60e-4032x3024.png" alt=""/><figcaption></figcaption></figure><ul><li><a href="https://blog.queuedlab.com/posts/ipp-42-tokyo-2">한국어로 읽기</a></li><li><a href="https://blog.queuedlab.com/posts/ipp-42-tokyo-1-en">IPP 42 Tokyo — (1)</a></li><li><a href="https://blog.queuedlab.com/posts/ipp-42-tokyo-2-en">IPP 42 Tokyo — (2)</a> (Current post)</li></ul><h2>Day 3</h2><h3>Puzzle Party</h3><p>The third day of IPP had begun. The day before, Jinhoo Ahn warned us to be prepared for the Puzzle Party. It‘s an event where designers and crafters sell their puzzles at individual booths. Popular puzzles sell out quickly, so I had to move fast. I also made sure to bring plenty of cash with me.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/5de9aed58b87d8ebbb6acbb38d3555bbdb895fa8-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/5de9aed58b87d8ebbb6acbb38d3555bbdb895fa8-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/d24f015d457b9b2dfba5c0bf52f3200aeb75329f-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/d24f015d457b9b2dfba5c0bf52f3200aeb75329f-5712x4284.png" alt=""/><figcaption></figcaption></figure><p>As soon as the Puzzle Party opened, I quickly scanned the booths and headed to MINE’s booth first. I really wanted <strong>Coin Wallet</strong> and <strong>Karakuri Packing</strong>, both winners of previous design competitions. Luckily enough, there was exactly one of each left, so I picked them up immediately.</p><p>I also managed to get <strong>Diagonal Twins</strong>, one of this year’s design competition entries, but I’ll talk more about it later.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/8a1db4fed74054dc3a12421ab195a8e3fcce57d1-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/8a1db4fed74054dc3a12421ab195a8e3fcce57d1-5712x4284.png" alt=""/><figcaption></figcaption></figure><p>I wandered around, picking up any puzzles that caught my eye. I eventually arrived at Stephen’s booth and spotted the puzzle pen he had shown me at the exchange event. Its official name is <strong>Ze Super Stylus Pen</strong>. It ended up being the most expensive one I bought, but I simply couldn&#x27;t resist my curiosity about how it worked.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/329bc5005a623b63d1f854fe946e9c8d4d842da7-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/329bc5005a623b63d1f854fe946e9c8d4d842da7-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/0a7f990d1c9f3a7a0c57c435f7a3c97c135cbe0f-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/0a7f990d1c9f3a7a0c57c435f7a3c97c135cbe0f-5712x4284.png" alt=""/><figcaption></figcaption></figure><p>Then I visited <strong>Yavuz Demirhan</strong>&#x27;s booth to buy <strong>Rombox</strong>, another entry in this year&#x27;s design competition. I already owned one puzzle from his Squary Pack series, and he told me that Rombox would be the last puzzle in that series. It had yet another interesting move and felt like a perfect finale to the series.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/7d054fcfb55823cd8cf7123c2f3ba821884e4417-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/7d054fcfb55823cd8cf7123c2f3ba821884e4417-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/f101b4ef50cedf9888f8f749282dc38e2b5c3a81-1530x2040.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/f101b4ef50cedf9888f8f749282dc38e2b5c3a81-1530x2040.jpg" alt=""/><figcaption></figcaption></figure><p>There were so many interesting puzzles that I ended up spending all the cash I had brought. I even borrowed some from Marco to buy a few more puzzles! Jinhoo said he was impressed by how skillfully we managed to get the puzzles we wanted, considering it was our first IPP.</p><p>After the Puzzle Party, I had to solve the real-world packing puzzle: fitting all the puzzles in my suitcase. In fact, the puzzles alone were enough to fill up my suitcase, so I had to buy another bag for my clothes and other stuff.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/1fc874b640f44b783a045fbcae25350f5ce12b12-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/1fc874b640f44b783a045fbcae25350f5ce12b12-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/d0a9cbac6c4bbd6fab645c5eda10e39335dc4812-4284x5712.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/d0a9cbac6c4bbd6fab645c5eda10e39335dc4812-4284x5712.png" alt=""/><figcaption></figcaption></figure><h3>Lectures</h3><p>In the afternoon, there were four lectures:</p><ul><li>The Memory of Hiroshi Yamamoto (Lixy Yamada)</li><li>Solving the Cataloging Puzzle - It Will Take a Village (Marc Pawliger)</li><li>Between &quot;Obvious&quot; and &quot;Impossible&quot; (Koichi Miura)</li><li>World Puzzle Center (Roxanne &amp; George Miller)</li></ul><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/2e7cc7db16f7a35281ba800be30b059c05f1da7c-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/2e7cc7db16f7a35281ba800be30b059c05f1da7c-5712x4284.png" alt=""/><figcaption></figcaption></figure><p>Every talk was fascinating, and I listened with full attention.</p><p>Personally, I wanted to meet <strong>Hiroshi Yamamoto</strong>, because his puzzle Copy Device was an inspiration for my puzzle <a href="https://blog.queuedlab.com/posts/canal-puzzle">Canal</a>. Ex 3 is another of his masterpiece, which popularized the symmetry puzzle genre. I didn’t know until <strong>Lixy Yamada</strong>’s lecture that he passed away in 2024. I wish I’d had the chance to talk with him in person.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/e31c792af46a96e70d91b7b3703d6ad38426fea9-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/e31c792af46a96e70d91b7b3703d6ad38426fea9-4032x3024.png" alt=""/><figcaption></figcaption></figure><p><strong>Marc Pawliger</strong>’s project to create a universal puzzle database was fascinating. He gave a presentation to invite people to join the project. Like everyone, I’ve often had trouble finding a specific puzzle among hundreds of puzzles (I don’t even know the exact number) stored randomly in boxes. A puzzle database and an app for managing personal collections would be really useful, and I’m looking forward to it.</p><p>Through <strong>Koichi Miura</strong>’s presentation, I was able to peek into how he thinks when designing puzzles. His puzzles are always innovative and elegant, so they’re among my favorite pieces in my collection. I found his philosophy interesting, that a great puzzle emerges when you strike a balance between what seems obvious and what seems impossible.</p><p>In the last presentation, <strong>Roxanne Miller</strong> and <strong>George Miller</strong> showed us the castle they had renovated into the World Puzzle Center. There were dozens of rooms packed with shelves, each of which was packed with puzzles. If there were a puzzle heaven, it would look like this place! I should visit Italy someday to walk through that heaven with my own feet.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/f3c3d6373ec0eb5ddead1bd5e0d338bfce1ebafd-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/f3c3d6373ec0eb5ddead1bd5e0d338bfce1ebafd-4032x3024.png" alt=""/><figcaption></figcaption></figure><h3>Awards Dinner</h3><p>The finale of IPP was the Awards Dinner.</p><p>I had to submit my votes for the Design Competition before the lectures begin. I could only select five entries, so I debated with myself until the very end. I wished I could have nominated more puzzles.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/d86e03d84926c1882e66ab6f87b4bdcf7b921b8d-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/d86e03d84926c1882e66ab6f87b4bdcf7b921b8d-5712x4284.png" alt=""/><figcaption></figcaption></figure><p>The design with the highest vote score wins the Puzzler’s Award. There are also jury-selcted awards: the Jury Grand/1st Prize and the Jury Honorable Mention. The winners receive a trophy, and even the trophy itself is a puzzle!</p><p>The top ten puzzles by votes are also mentioned during the ceremony and listed on the competition website.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/6161e272f5b2eaa446be396ae98944444db63087-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/6161e272f5b2eaa446be396ae98944444db63087-4032x3024.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/9178a81eb6522186240da61dc9b903d9a6b77866-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/9178a81eb6522186240da61dc9b903d9a6b77866-4032x3024.png" alt=""/><figcaption></figcaption></figure><p>And the Puzzler’s Award went to… <strong>Diagonal Twins</strong>, by <strong>Yasuhiro Hashimoto</strong>!</p><p>It was so well deserved, with such an elegant solution built from just four simple pieces. Its look reminds me of <strong>Pin Block Case</strong> by <strong>Hajime Katsumoto</strong>, yet it has its own unique character through the use of diagonals. The two designers seem to inspire each other’s work, as you can also see in the development from 4L by Yasuhiro Hashimoto to 4PAC by Hajime Katsumoto. It feels like an ongoing conversation carried out through puzzles, which I find fascinating.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/f64cd88385f5373d56f7fca34e8d6c8882f42f9e-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/f64cd88385f5373d56f7fca34e8d6c8882f42f9e-4032x3024.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/7f461ba5318e8297cef8f89c0cfc2d2332226438-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/7f461ba5318e8297cef8f89c0cfc2d2332226438-5712x4284.png" alt=""/><figcaption>Pin Block Case (Hajime Katsumoto) / Diagonal Twins (Yasuhiro Hashimoto)</figcaption></figure><p><strong>Chained Frames</strong>, which was my favorite as I mentioned in the previous post, won a Jury Honorable Mention. I never expected it to be by <strong>Koichi Miura</strong>, because it felt so different from his usual style. I’m glad to see him trying new ideas and exploring different areas of puzzle design.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/2ca665b9cd09c397bc46943d28a90f60e2656150-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/2ca665b9cd09c397bc46943d28a90f60e2656150-4032x3024.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/8de3705984bdd3f790d7361c5a77f8571cd6b4f0-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/8de3705984bdd3f790d7361c5a77f8571cd6b4f0-4032x3024.png" alt=""/><figcaption></figcaption></figure><p>He also won another award for his <strong>Tetromino Island</strong> puzzle. Two awards in a single year is an amazing achievement.</p><p>I went up to him to say congratulations, and asked him to sign my copy of his Legal Packing puzzle. That completed my little mission to collect designers’ autographs on my puzzles.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/e5638c4ef3f00fc68af0fba4b2b9c26d9203dee0-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/e5638c4ef3f00fc68af0fba4b2b9c26d9203dee0-5712x4284.png" alt=""/><figcaption>4L (Yasuhiro Hashimoto) / Cast Valve (Vesa Timonen) / Minima 1 (Frederic Boucher) / Waltz (Osanori Yamamoto) / Squary Pack No.5 (Yavuz Demirhan)  / Slide Packing (Hajime Katsumoto) / Legal Packing (Koichi Miura) / Rush Hour Train (Edi Nagata, originally Arrow Case)</figcaption></figure><p>After the award ceremony, there was a final moment to introduce people who had worked hard to prepare IPP in Tokyo, including Iwahiro. Sometime during IPP, Iwahiro said that he hoped the KPP members would one day host an IPP in Korea. Seeing that long line of staff members, I’m not sure whether it will be possible, but it will be truly amazing if it ever happens.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/5b24dbd0fae5a02c661cd47738c8e822944d5e95-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/5b24dbd0fae5a02c661cd47738c8e822944d5e95-5712x4284.png" alt=""/><figcaption></figcaption></figure><h2>Closing Thoughts</h2><p>First of all, I’d like to express my infinite gratitude to <strong>Iwahiro</strong> for inviting the KPP members to the IPP. Thank you also for the hard work in successfully organizing such a large-scale event.</p><p>Also, I really appreciate <strong>Takeshi Onishi</strong> for spending some time with us at IPP. As a newcomer, I was a bit overwhelmed at first, but thanks to him I was able to settle in quickly. He also kindly treated us to a delicious dinner on Day 1, when we were so caught up in the reception that we’d forgotten how hungry we were.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/dde110f79869e2dbb6b709e8b4b793a8b8afa86e-4284x5712.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/dde110f79869e2dbb6b709e8b4b793a8b8afa86e-4284x5712.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/4ebd3c0bbc30ad129ec114b910146a03cd52bb4b-3024x4032.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/4ebd3c0bbc30ad129ec114b910146a03cd52bb4b-3024x4032.jpg" alt=""/><figcaption></figcaption></figure><p>I’m also grateful to the KPP members for being part of this journey, as well as everyone I had wonderful conversations with at the IPP.</p><p>Going to the IPP for the first time was really inspiring. I haven’t been able to focus on puzzles lately, but I’m going to start putting effort into creating fun puzzles again. I even bought a 3D printer as a part of that! I’m hoping to share more puzzle posts soon, possibly an IPP 42 puzzle review, a 3D printer write-up, or my new puzzle designs.</p>]]></content>
        <author>
            <name>queuedlab</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[IPP 42 도쿄 — (2)]]></title>
        <id>https://blog.queuedlab.com/posts/ipp-42-tokyo-2</id>
        <link href="https://blog.queuedlab.com/posts/ipp-42-tokyo-2"/>
        <updated>2025-11-12T11:46:52.351Z</updated>
        <summary type="html"><![CDATA[인생 첫 IPP의 마지막 날이 밝았습니다. 퍼즐 파티, 강연, 시상식에 참석했습니다.]]></summary>
        <content type="html"><![CDATA[<link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/d797906b98c85a7153aa4e38b424961310e7f60e-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/d797906b98c85a7153aa4e38b424961310e7f60e-4032x3024.png" alt=""/><figcaption></figcaption></figure><ul><li><a href="https://blog.queuedlab.com/posts/ipp-42-tokyo-2-en">Read in English</a></li><li><a href="https://blog.queuedlab.com/posts/ipp-42-tokyo-1">IPP 42 도쿄 — (1)</a></li><li><a href="https://blog.queuedlab.com/posts/ipp-42-tokyo-2">IPP 42 도쿄 — (2)</a> (현재 글)</li></ul><h2>Day 3</h2><h3>Puzzle Party</h3><p>IPP의 셋째 날 아침이 밝았습니다. 전날에 안진후 씨가 퍼즐 파티(Puzzle Party)에 대비해서 마음의 준비를 해 두라고 일러 주셨습니다. 퍼즐 디자이너와 제작자들이 부스를 차리고 퍼즐을 판매하는 행사인데, 인기 있는 퍼즐들은 금방 매진되기 때문에 서둘러야 하거든요. 현금도 잊지 않고 넉넉히 챙겼습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/43b0d762177a988eac7e0fa74884f2cc3759610a-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/43b0d762177a988eac7e0fa74884f2cc3759610a-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/5de9aed58b87d8ebbb6acbb38d3555bbdb895fa8-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/5de9aed58b87d8ebbb6acbb38d3555bbdb895fa8-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/d24f015d457b9b2dfba5c0bf52f3200aeb75329f-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/d24f015d457b9b2dfba5c0bf52f3200aeb75329f-5712x4284.png" alt=""/><figcaption></figcaption></figure><p>퍼즐 파티가 개장하자마자 어떤 부스가 있는지 빠르게 훑어본 다음, 가장 먼저 미네 씨의 부스로 향했습니다. 퍼즐 디자인 대회 수상작이었던 <strong>Coin Wallet</strong>과 <strong>Karakuri Packing</strong>을 꼭 가지고 싶었는데, 운 좋게도 마침 딱 하나씩 남아 있어서 잽싸게 집어들었습니다.</p><p>이번 출품작인 <strong>Diagonal Twins</strong>도 구매에 성공했는데, 이 작품에 대해서는 뒤에서 더 자세히 이야기하겠습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/8a1db4fed74054dc3a12421ab195a8e3fcce57d1-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/8a1db4fed74054dc3a12421ab195a8e3fcce57d1-5712x4284.png" alt=""/><figcaption></figcaption></figure><p>행사장을 돌아다니면서 눈에 띄는 퍼즐을 마구 사들이다가 스티븐 씨의 부스에 도달했습니다. 퍼즐 교환 행사에서 그가 보여 준 볼펜 퍼즐이 눈에 들어왔습니다. 정식 명칭은 <strong>Ze Super Stylus Pen</strong>입니다. 이번에 산 퍼즐 중에 가장 비쌌지만, 어떻게 동작하는 퍼즐일까 호기심을 참지 못해서 큰맘 먹고 구매했습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/329bc5005a623b63d1f854fe946e9c8d4d842da7-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/329bc5005a623b63d1f854fe946e9c8d4d842da7-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/0a7f990d1c9f3a7a0c57c435f7a3c97c135cbe0f-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/0a7f990d1c9f3a7a0c57c435f7a3c97c135cbe0f-5712x4284.png" alt=""/><figcaption></figcaption></figure><p>이번 디자인 대회의 또 다른 출품작인 <strong>Rombox</strong>를 구매하기 위해 <strong>야부즈 데미르한 (Yavuz Demirhan)</strong> 씨의 부스도 방문했습니다. 저는 야부즈 씨의 Squary Pack 퍼즐 시리즈 중 하나를 소장하고 있는데, Rombox가 그 시리즈의 마지막 작품이 될 것이라는 이야기를 들었습니다. 기존 퍼즐과 비슷한 구성이지만 또 다른 흥미로운 움직임이 더해져 있어서, 시리즈의 마지막을 장식하기에 완벽한 퍼즐이라고 느꼈습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/7d054fcfb55823cd8cf7123c2f3ba821884e4417-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/7d054fcfb55823cd8cf7123c2f3ba821884e4417-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/f101b4ef50cedf9888f8f749282dc38e2b5c3a81-1530x2040.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/f101b4ef50cedf9888f8f749282dc38e2b5c3a81-1530x2040.jpg" alt=""/><figcaption></figcaption></figure><p>눈길을 사로잡는 퍼즐이 너무 많은 나머지 준비해 온 현금을 다 써버리고 말았습니다. 심지어는 아직 사고 싶은 퍼즐이 남았는데도 돈이 부족해져서 마르코 씨에게 빌리기까지 했습니다. 안진후 씨는 저희가 첫 IPP 치고는 너무나 능숙하게 원하는 퍼즐을 손에 넣은 것 같다며 감탄을 금치 못했습니다.</p><p>퍼즐 파티가 끝난 뒤에는, 모든 퍼즐을 캐리어에 집어넣는 진짜 현실 패킹 퍼즐을 풀 차례였습니다. 사실은 퍼즐만으로 이미 캐리어가 가득 차버려서 돌아오는 날에 옷가지와 다른 짐을 넣을 가방을 사야만 했답니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/1fc874b640f44b783a045fbcae25350f5ce12b12-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/1fc874b640f44b783a045fbcae25350f5ce12b12-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/d0a9cbac6c4bbd6fab645c5eda10e39335dc4812-4284x5712.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/d0a9cbac6c4bbd6fab645c5eda10e39335dc4812-4284x5712.png" alt=""/><figcaption></figcaption></figure><h3>Lectures</h3><p>오후에는 네 개의 강연이 있었습니다.</p><ul><li>야마모토 히로시를 기억하며 / The Memory of Hiroshi Yamamoto (Lixy Yamada)</li><li>퍼즐 분류하기 퍼즐 - 온 마을의 힘을 합쳐야 한다 / Solving the Cataloging Puzzle - It Will Take a Village (Marc Pawliger)</li><li>“명백함”과 “불가능”의 사이 / Between &quot;Obvious&quot; and &quot;Impossible&quot; (Koichi Miura)</li><li>세계 퍼즐 센터 / World Puzzle Center (Roxanne &amp; George Miller)</li></ul><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/2e7cc7db16f7a35281ba800be30b059c05f1da7c-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/2e7cc7db16f7a35281ba800be30b059c05f1da7c-5712x4284.png" alt=""/><figcaption></figcaption></figure><p>모든 발표가 흥미로워서 풀집중 상태로 들었습니다.</p><p>개인적으로 <strong>야마모토 히로시 (Hiroshi Yamamoto)</strong> 씨를 만나보고 싶었는데, 그의 Copy Device 퍼즐은 제 <a href="https://blog.queuedlab.com/posts/canal-puzzle">Canal 퍼즐</a>에 영감을 준 작품이었기 때문입니다. 히로시 씨의 또 다른 대표적인 명작으로는, 대칭 퍼즐(symmetry puzzle) 장르를 유행시킨 Ex 3가 있습니다. 그가 2024년에 세상을 떠났다는 사실은 <strong>릭시 야마다 (Lixy Yamada)</strong> 씨의 강연을 듣고서야 알았습니다. 대화를 나눠 볼 기회가 있었으면 좋았을텐데 참 안타깝습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/e31c792af46a96e70d91b7b3703d6ad38426fea9-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/e31c792af46a96e70d91b7b3703d6ad38426fea9-4032x3024.png" alt=""/><figcaption></figcaption></figure><p><strong>마크 폴리거 (Marc Pawliger)</strong> 씨의 전 세계 퍼즐 데이터베이스를 만들겠다는 야심찬 프로젝트도 흥미로웠습니다. 저 역시 (정확히 몇 개인지도 모르는) 수백 개의 퍼즐을 박스에 대충 아무렇게나 보관해 둬서, 가지고 있는 퍼즐을 찾을 때 애를 먹은 경험이 있죠. 퍼즐 데이터베이스가 만들어지고 각자의 콜렉션을 관리할 수 있는 앱이 등장한다면 정말 편리할 것 같아 기대가 됩니다.</p><p><strong>미우라 코이치 (Koichi Miura)</strong> 씨의 발표를 통해서는 그가 퍼즐을 디자인할 때 어떤 생각을 하는지 엿볼 수 있었습니다. 코이치 씨의 퍼즐은 매번 혁신적이고 아름다워서 제 콜렉션에서 가장 소중한 작품들 중 하나입니다. 명백히 가능해 보이는 것과 불가능해 보이는 것, 그 사이의 밸런스를 찾으면 흥미로운 퍼즐이 된다는 철학이 재밌었습니다.</p><p>마지막 발표에서는 <strong>록산 밀러 (Roxanne Miller)</strong> 씨와 <strong>조지 밀러 (George Miller)</strong> 씨가 이탈리아의 성을 매입해서 세계 퍼즐 센터(World Puzzle Center)로 개조한 이야기를 들려주었습니다. 수십 개의 방이 선반으로 가득 차 있었고, 그 선반들은 다시 퍼즐로 가득 차 있었습니다. 퍼즐 천국이 있다면 바로 이곳이 아닐까요? 언젠가 꼭 이탈리아에 가서 두 발로 직접 그 천국을 걸어 보고 싶습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/f3c3d6373ec0eb5ddead1bd5e0d338bfce1ebafd-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/f3c3d6373ec0eb5ddead1bd5e0d338bfce1ebafd-4032x3024.png" alt=""/><figcaption></figcaption></figure><h3>Awards Dinner</h3><p>IPP의 마지막은 시상식 만찬(Awards Dinner)이 장식했습니다.</p><p>강연이 시작하기 전까지 퍼즐 디자인 대회의 투표용지를 제출해야 했는데, 단 다섯 개의 작품만 고를 수 있어서 마지막의 마지막까지 고민했습니다. 표를 주고 싶은 퍼즐이 몇 개 더 있었는데 말입니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/d86e03d84926c1882e66ab6f87b4bdcf7b921b8d-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/d86e03d84926c1882e66ab6f87b4bdcf7b921b8d-5712x4284.png" alt=""/><figcaption></figcaption></figure><p>가장 많은 표를 받은 작품은 퍼즐러 상(Puzzler&#x27;s Award)을 받습니다. 또한 심사위원이 선정하는 대상(Jury Grand Prize), 1등상(Jury 1st Prize), 특별상(Jury Honorable Mention)이 있습니다. 수상자는 트로피를 받는데, 트로피마저도 퍼즐입니다!</p><p>득표 수 상위 10개에 든 퍼즐은 상을 받지는 못해도 시상식에서 언급되고 대회 홈페이지에도 기재됩니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/6161e272f5b2eaa446be396ae98944444db63087-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/6161e272f5b2eaa446be396ae98944444db63087-4032x3024.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/9178a81eb6522186240da61dc9b903d9a6b77866-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/9178a81eb6522186240da61dc9b903d9a6b77866-4032x3024.png" alt=""/><figcaption></figcaption></figure><p>그리고 올해의 퍼즐러 상은… <strong>하시모토 야스히로 (Yasuhiro Hashimoto)</strong> 씨의 <strong>Diagonal Twins</strong>가 차지했습니다!</p><p>단 네 개의 단순한 조각만으로 우아한 해법을 완성시킨 이 퍼즐은, 퍼즐러 상을 받을 자격이 충분했다고 생각합니다. 저는 Diagonal Twins를 보고 <strong>카츠모토 하지메 (Hajime Katsumoto)</strong> 씨의 <strong>Pin Block Case</strong>를 연상했는데, 비슷한 외관을 가졌으면서도 대각선을 활용한 이 퍼즐만의 특별함이 있습니다. 두 분은 서로의 작품에 영감을 주고받는 사이처럼 느껴졌습니다. 야스히로 씨의 4L 퍼즐에서 하지메 씨의 4PAC 퍼즐로 이어지는 발전에서도 그 관계를 엿볼 수 있죠. 마치 퍼즐을 통해 대화를 주고받으며 협동하는 것처럼 느껴져서 재밌습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/f64cd88385f5373d56f7fca34e8d6c8882f42f9e-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/f64cd88385f5373d56f7fca34e8d6c8882f42f9e-4032x3024.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/7f461ba5318e8297cef8f89c0cfc2d2332226438-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/7f461ba5318e8297cef8f89c0cfc2d2332226438-5712x4284.png" alt=""/><figcaption>Pin Block Case (Hajime Katsumoto) / Diagonal Twins (Yasuhiro Hashimoto)</figcaption></figure><p>지난 글에서 가장 마음에 들었다고 언급했던 <strong>Chained Frames</strong>는 심사위원 특별상(Jury Honorable Mention)을 받았습니다. 디자이너는 <strong>미우라 코이치 (Koichi Miura)</strong> 씨였는데, 정말 예상 밖의 인물이었습니다. 그의 평소 퍼즐 스타일과는 사뭇 다르게 느껴졌기 때문이죠. 그가 새로운 아이디어를 시도하고 다른 영역의 퍼즐에도 도전하는 모습이 참 반가웠습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/2ca665b9cd09c397bc46943d28a90f60e2656150-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/2ca665b9cd09c397bc46943d28a90f60e2656150-4032x3024.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/8de3705984bdd3f790d7361c5a77f8571cd6b4f0-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/8de3705984bdd3f790d7361c5a77f8571cd6b4f0-4032x3024.png" alt=""/><figcaption></figcaption></figure><p>코이치 씨는 <strong>Tetromino Island</strong> 퍼즐로 또 하나의 상을 받았습니다. 한 해에 두 개의 상을 받다니 정말 놀라운 성과입니다.</p><p>코이치 씨에게 다가가 축하의 말을 전하고, 제가 가져온 그의 Legal Packing 퍼즐에 사인을 받았습니다. 이로써 저는 가져온 퍼즐들에 디자이너 사인을 받는 임무를 마쳤습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/e5638c4ef3f00fc68af0fba4b2b9c26d9203dee0-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/e5638c4ef3f00fc68af0fba4b2b9c26d9203dee0-5712x4284.png" alt=""/><figcaption>4L (Yasuhiro Hashimoto) / Cast Valve (Vesa Timonen) / Minima 1 (Frederic Boucher) / Waltz (Osanori Yamamoto) / Squary Pack No.5 (Yavuz Demirhan)  / Slide Packing (Hajime Katsumoto) / Legal Packing (Koichi Miura) / Rush Hour Train (Edi Nagata, originally Arrow Case)</figcaption></figure><p>시상식이 끝나고 마지막으로, 이와히로 씨를 비롯해 도쿄에서의 IPP를 준비하는 데 힘써 준 사람들을 소개하는 자리가 있었습니다. 이와히로 씨는 KPP 회원들이 한국에서도 IPP를 열었으면 좋겠다며 잔뜩 기대를 품었는데, 저 많은 스태프 명단을 보니 가능할지는 모르겠지만 만약 이루어진다면 정말 멋진 일이 될 것 같습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/5b24dbd0fae5a02c661cd47738c8e822944d5e95-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/5b24dbd0fae5a02c661cd47738c8e822944d5e95-5712x4284.png" alt=""/><figcaption></figcaption></figure><h2>글을 마치며</h2><p>먼저 저희 KPP 멤버들을 IPP에 초대해 주신 <strong>이와히로 (Iwahiro)</strong> 씨에게 무한한 감사를 드립니다. 이렇게 대규모의 이벤트를 성공적으로 개최하는 데에도 힘써 주셔서 고생 많으셨습니다.</p><p>또, 저희와 종종 함께 시간을 보내 주신 <strong>오니시 타케시 (Takeshi Onishi)</strong> 씨 덕분에 정신 없이 돌아가는 행사에 금방 적응할 수 있었습니다. 첫날 환영회에 정신이 팔려 굶주리고 있던 저희에게 맛있는 저녁을 대접해 주시기도 했는데 정말 감사했습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/dde110f79869e2dbb6b709e8b4b793a8b8afa86e-4284x5712.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/dde110f79869e2dbb6b709e8b4b793a8b8afa86e-4284x5712.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/4ebd3c0bbc30ad129ec114b910146a03cd52bb4b-3024x4032.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/4ebd3c0bbc30ad129ec114b910146a03cd52bb4b-3024x4032.jpg" alt=""/><figcaption></figcaption></figure><p>여정을 함께했던 KPP 회원들과, IPP에서 대화를 나눈 다른 모든 이들에게도 감사를 전합니다.</p><p>처음으로 IPP를 다녀오고 나서 많은 자극이 되었습니다. 한동안 퍼즐에 집중하지 못했는데, 재밌는 퍼즐들을 창작하기 위해 다시금 노력을 쏟아 보려고 합니다. 그 일환으로 3D 프린터도 샀습니다! 조만간 더 많은 퍼즐 글로 찾아오겠습니다. IPP 42 퍼즐 리뷰나, 3D 프린터 사용기가 될 수도 있고, 어쩌면 제 새 퍼즐 디자인이 될 수도 있고요.</p><p></p>]]></content>
        <author>
            <name>queuedlab</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[IPP 42 Tokyo — (1)]]></title>
        <id>https://blog.queuedlab.com/posts/ipp-42-tokyo-1-en</id>
        <link href="https://blog.queuedlab.com/posts/ipp-42-tokyo-1-en"/>
        <updated>2025-11-02T12:50:28.732Z</updated>
        <summary type="html"><![CDATA[I was invited to IPP (International Puzzle Party) for the first time!]]></summary>
        <content type="html"><![CDATA[<link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/2f11ffacd842366c5beba999b09ed1d92aa3fd6c-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/2f11ffacd842366c5beba999b09ed1d92aa3fd6c-4032x3024.png" alt=""/><figcaption></figcaption></figure><ul><li><a href="https://blog.queuedlab.com/posts/ipp-42-tokyo-1">한국어로 읽기</a></li><li><a href="https://blog.queuedlab.com/posts/ipp-42-tokyo-1-en">IPP 42 Tokyo — (1)</a> (Current post)</li><li><a href="https://blog.queuedlab.com/posts/ipp-42-tokyo-2-en">IPP 42 Tokyo — (2)</a></li></ul><p>I was invited to IPP (International Puzzle Party) 42 in Tokyo last September (September 26-28). I was so excited because it was my first IPP!</p><p>There were three new invitees from Korea: <strong>Eugene Yu, Marco Jung, and me (Dongkyu Han)</strong>. We’re all members of KPP (Korean Puzzle Party), and <a href="https://blog.queuedlab.com/posts/2024-12-kpp">Iwahiro kindly invited us</a>. <strong>Jinhoo Ahn</strong>, who has been an IPP member for years, was there as well.</p><p>Before the event, Eugene and I took a short trip around the area. We visited Tokyo Skytree, Sensoji, and Akihabara. I also bought some puzzles at the puzzle shop Torito.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/ce7e15f7c978c8114246cd3af253ef67a0133e37-4284x5712.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/ce7e15f7c978c8114246cd3af253ef67a0133e37-4284x5712.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/83898d704657b01e5d11dafe37203a5c707fedd6-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/83898d704657b01e5d11dafe37203a5c707fedd6-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/16f427f04b92d8024a40fc6d486e84ee39df532c-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/16f427f04b92d8024a40fc6d486e84ee39df532c-5712x4284.png" alt=""/><figcaption></figcaption></figure><h2>Day 1 — Founder’s Reception</h2><p>On the first day, IPP opened with the Founder’s Reception.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/9863e760e9e85aed97099058e460c7aa26da3e6c-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/9863e760e9e85aed97099058e460c7aa26da3e6c-5712x4284.png" alt=""/><figcaption></figcaption></figure><p><strong>Jerry Slocum</strong>, who founded IPP in 1978, welcomed the new invitees. One by one, we briefly introduced ourselves and shook his hand. When I shook hands with Jerry Slocum, now in his nineties, I felt that I had finally become a part of this long-standing culture.</p><p>Then, as soon as I stepped down, several people rushed over and handed me their welcome gift puzzles! My hands were already full of puzzles, and the event had only just begun. Never expected such an enthusiastic reception!</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/6518c0d9d5384ffe9e2eaff967df7ac8e689517d-4284x5712.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/6518c0d9d5384ffe9e2eaff967df7ac8e689517d-4284x5712.jpg" alt=""/><figcaption></figcaption></figure><p>I also had a chance to meet well-known puzzlers including Vesa Timonen, Frederic Boucher, Nick Baxter, Koichi Miura, Edi Nagata, and Mineyuki Uyematsu (MINE) for the first time. I wandered around and got some desginers’ autographs on the puzzles I own.</p><p>When I introduced myself to <strong>MINE</strong>, I was surprised that he recognized my name. He mentioned that he liked my <a href="https://blog.queuedlab.com/posts/canal-puzzle">Canal puzzle</a>, which Iwahiro had shown him earlier. I was happy to hear that and decided to give him a copy of the Canal as a gift.</p><p>In return, he handed me one of the <strong>Dualock</strong> puzzles that the late Nob Yoshigahara had left to him. Nob Yoshigahara is a legendary figure in the puzzle world, so much so that there’s even an award named after him. Dualock is one of his earliest works, and probably one of the most influential puzzles ever made. Receiving such a puzzle was a great honor, and it inspired me to keep creating puzzles and contributing to the puzzle world.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/8cd4d7b5fa9b97f1725273631a93b133a73ea14e-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/8cd4d7b5fa9b97f1725273631a93b133a73ea14e-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/a4fc913a8607cd361f65b2006db5e858f0bad582-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/a4fc913a8607cd361f65b2006db5e858f0bad582-5712x4284.png" alt=""/><figcaption></figcaption></figure><h2>Day 2 — Puzzle Exchange, Design Competition</h2><p>The second day began with the Puzzle Exchange.</p><p>Since it was my first time attending, I wasn’t eligible for the exchange. You have to serve as an assistant in order to join the exchange from the following year on. The idea is that, you first work as an assistant so you can learn how the Puzzle Exchange works. Luckily, all three of us new Korean invitees were able to apply as assistants.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/23e3c20f8a9989aff488afc48f263077571377fa-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/23e3c20f8a9989aff488afc48f263077571377fa-4032x3024.png" alt=""/><figcaption></figcaption></figure><p>I was an assistant for <strong>Stephen Chin</strong>. He is a woodworker and brought special tippe tops he crafted as his exchange puzzle. I carried a bag full of his puzzles and checked off the exchangers list. He treated everyone like family, joking around and telling me stories. I got to meet a lot of puzzlers thanks to him.</p><p>At one point, he told me that the pen I was using to mark the list was actually a puzzle box he made. He said that if you solve the puzzle, you can find a hidden diamond. It looked just like an ordinary ballpoint pen, so I didn’t suspect a thing. What a surprise!</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/5407fe5e598c0f4a416be83ec6a0327628480a97-4874x3659.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/5407fe5e598c0f4a416be83ec6a0327628480a97-4874x3659.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/97ac55d7557a940b0ecf921e1a8e052d78025e11-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/97ac55d7557a940b0ecf921e1a8e052d78025e11-4032x3024.png" alt=""/><figcaption></figcaption></figure><p>Every exchanger had to donate one copy of their exchange puzzle to the Jerry Slocum Puzzle Collection at the Lilly Library. I really loved that the Puzzle Exchange wasn&#x27;t just a one-time event, but part of a tradition to preserve and continue the history of puzzles.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/d7b3db247b3801cf39b555a3f2354b339ce64b50-3729x2796.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/d7b3db247b3801cf39b555a3f2354b339ce64b50-3729x2796.png" alt=""/><figcaption></figcaption></figure><p>After the exchange, I spent some time in the Design Competition room, which was open throughout the event. Among the entries, <strong>Chained Frames</strong> left the strongest impression on me. Despite its plain appearance, it is solved through a series of beautiful movements. I couldn’t help but strongly recommend it to Takeshi Onishi from Hanayama. Maybe one day Hanayama will release it as a Cast Puzzle?</p><p>Other memorable puzzles included <strong>Diagonal Twins, Rombox, Fudge, Tetromino Island, Toaster, Star Puzzle</strong>, … and so on. (not in any particular order)</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/39731ea285fa3b25416066a1f62324b899a55ec2-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/39731ea285fa3b25416066a1f62324b899a55ec2-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/1d918de03f8eaf4363e2292585f29ef8809639c3-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/1d918de03f8eaf4363e2292585f29ef8809639c3-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/c3c00f0e84a4fd1f104a5e9892615d5320c112cb-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/c3c00f0e84a4fd1f104a5e9892615d5320c112cb-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/338d630bfdfb2c119f1a974c4d793e8386153763-4284x5712.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/338d630bfdfb2c119f1a974c4d793e8386153763-4284x5712.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/19cd2dd7e4b1f7f97a2a5ba6b721895d36c7e191-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/19cd2dd7e4b1f7f97a2a5ba6b721895d36c7e191-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/c4a791993c9ee2d535619b52a96928abe122f9d4-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/c4a791993c9ee2d535619b52a96928abe122f9d4-5712x4284.png" alt=""/><figcaption></figcaption></figure><p>In the evening, there was a banquet with a magic show and an announcement about next year&#x27;s IPP. During the show, there was a magic involving a Rubik’s Cube. When the magician asked if anyone in the audience could solve a cube, Eugene volunteered and solved it.</p><iframe title="YouTube Embed" src="https://www.youtube.com/embed/KurI9E5zMsc" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" class="aspect-video w-full"></iframe><p>And that was the end of Day 2.</p><p></p><ul><li><strong>Read part 2:</strong> <a href="https://blog.queuedlab.com/posts/ipp-42-tokyo-2-en">IPP 42 Tokyo — (2)</a></li></ul>]]></content>
        <author>
            <name>queuedlab</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[IPP 42 도쿄 — (1)]]></title>
        <id>https://blog.queuedlab.com/posts/ipp-42-tokyo-1</id>
        <link href="https://blog.queuedlab.com/posts/ipp-42-tokyo-1"/>
        <updated>2025-11-02T12:49:20.190Z</updated>
        <summary type="html"><![CDATA[처음으로 IPP (International Puzzle Party)에 초대받았습니다!]]></summary>
        <content type="html"><![CDATA[<link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/2f11ffacd842366c5beba999b09ed1d92aa3fd6c-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/2f11ffacd842366c5beba999b09ed1d92aa3fd6c-4032x3024.png" alt=""/><figcaption></figcaption></figure><ul><li><a href="https://blog.queuedlab.com/posts/ipp-42-tokyo-1-en">Read in English</a></li><li><a href="https://blog.queuedlab.com/posts/ipp-42-tokyo-1">IPP 42 도쿄 — (1)</a> (현재 글)</li><li><a href="https://blog.queuedlab.com/posts/ipp-42-tokyo-2">IPP 42 도쿄 — (2)</a></li></ul><p>지난 9월 26-28일에 도쿄에서 열린 IPP (International Puzzle Party) 42에 초대받았습니다! 처음으로 IPP에 참가하는 것이었기 때문에 잔뜩 기대를 품었습니다.</p><p>이번 IPP에 새롭게 초대받은 한국인은 KPP (Korean Puzzle Party) 회원인 <strong>유창현 씨, 마르코 씨, 저(한동규)</strong> 이렇게 세 명입니다. 감사하게도, <a href="https://blog.queuedlab.com/posts/2024-12-kpp">지난 KPP 모임 때 방문해 주셨던 이와히로 씨</a>가 이번 IPP에 저희를 초대해 주셨습니다. IPP의 오랜 멤버였던 <strong>안진후</strong> 씨도 참석했습니다.</p><p>IPP 행사가 본격적으로 시작하기 전에, 저는 유창현 씨와 함께 호텔 근교를 여행했습니다. 도쿄 스카이트리, 센소지, 아키하바라를 방문했고, 퍼즐샵 토리토에서 퍼즐도 몇 개 샀습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/ce7e15f7c978c8114246cd3af253ef67a0133e37-4284x5712.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/ce7e15f7c978c8114246cd3af253ef67a0133e37-4284x5712.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/83898d704657b01e5d11dafe37203a5c707fedd6-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/83898d704657b01e5d11dafe37203a5c707fedd6-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/16f427f04b92d8024a40fc6d486e84ee39df532c-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/16f427f04b92d8024a40fc6d486e84ee39df532c-5712x4284.png" alt=""/><figcaption></figcaption></figure><h2>Day 1 — Founder’s Reception</h2><p>첫째 날은 창립자 환영회(Founder’s Reception)로 시작했습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/9863e760e9e85aed97099058e460c7aa26da3e6c-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/9863e760e9e85aed97099058e460c7aa26da3e6c-5712x4284.png" alt=""/><figcaption></figcaption></figure><p>1978년에 IPP를 창립한 <strong>제리 슬로컴 (Jerry Slocum)</strong> 씨가 새 참가자들을 환영해 주셨습니다. 한 명씩 차례로 앞에 나가 간단한 자기소개를 하고 악수를 했습니다. 이제는 90대 할아버지가 된 제리 슬로컴 씨와 악수를 하면서 나도 이제 이 오랜 문화의 일원이 되었구나 하는 감상이 들었습니다.</p><p>그리고 단상에서 내려오는 그 순간, 사람들이 저를 향해 우르르 몰려들었습니다. 그러고는 환영 선물이라며 퍼즐을 하나씩 건네주고 갔습니다. 행사를 시작하자마자 손이 벌써 퍼즐로 가득 차 버렸습니다. 예상치도 못한 뜨거운 환영식이었습니다!</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/6518c0d9d5384ffe9e2eaff967df7ac8e689517d-4284x5712.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/6518c0d9d5384ffe9e2eaff967df7ac8e689517d-4284x5712.jpg" alt=""/><figcaption></figcaption></figure><p>환영식에서 다른 유명한 퍼즐러들도 많이 만났습니다. 베사 티모넨 (Vesa Timonen), 프레데릭 부셰 (Frederic Boucher), 닉 백스터 (Nick Baxter), 미우라 코이치 (Koichi Miura), 나가타 에디 (Edi Nagata), 우에마츠 미네유키 (Mineyuki Uyematsu, MINE) 등 인터넷에서만 접했던 퍼즐러들을 실제로 볼 수 있었습니다. 행사장을 돌아다니면서 제가 소장하고 있는 퍼즐에 디자이너 사인도 받았습니다.</p><p><strong>미네 (MINE)</strong> 씨에게 인사를 드렸을 때, 놀랍게도 제 이름을 알아보셨습니다. 이와히로 씨가 미네 씨에게 제 <a href="https://blog.queuedlab.com/posts/canal-puzzle">Canal 퍼즐</a>을 보여줬는데 마음에 드는 디자인이었다고 말씀해 주셨습니다. 기쁜 마음에 마침 가지고 있던 Canal 퍼즐 하나를 선물로 드렸습니다.</p><p>답례로 줄 퍼즐이 있다면서 가방을 뒤적이더니, 고(故) 요시가하라 노부 (Nob Yoshigahara) 씨가 사후에 미네 씨에게 남긴 <strong>Dualock</strong> 퍼즐 중 하나를 제게 건네 주셨습니다. 요시가하라 노부 씨는 그의 이름을 딴 상이 있을 정도로 퍼즐계에서 전설적인 인물입니다. Dualock은 그의 초창기 작품으로, 아마도 가장 영향력 있는 퍼즐 중 하나일 겁니다. 그런 퍼즐을 받게 되다니 너무나도 큰 영광이었습니다. 앞으로 더 열심히 계속해서 퍼즐을 만들고, 퍼즐 세계에 기여해야겠다는 책임감이 들었습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/8cd4d7b5fa9b97f1725273631a93b133a73ea14e-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/8cd4d7b5fa9b97f1725273631a93b133a73ea14e-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/a4fc913a8607cd361f65b2006db5e858f0bad582-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/a4fc913a8607cd361f65b2006db5e858f0bad582-5712x4284.png" alt=""/><figcaption></figcaption></figure><h2>Day 2 — Puzzle Exchange, Design Competition</h2><p>둘째 날은 퍼즐 교환 행사(Puzzle Exchange)로 시작했습니다.</p><p>저는 이번이 첫 참가라서 교환에는 직접 참여할 수 없었습니다. 먼저 퍼즐 교환 행사에서 도우미(assistant)로 활동해야만 그 다음 해부터 직접 참여가 가능하다는 규칙이 있기 때문입니다. 도우미 활동을 하면서 퍼즐 교환 행사가 어떻게 진행되는지 배워 보라는 취지입니다. 다행히도 이번에 새로 온 한국인 세 명 모두 도우미로 지원할 수 있었습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/23e3c20f8a9989aff488afc48f263077571377fa-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/23e3c20f8a9989aff488afc48f263077571377fa-4032x3024.png" alt=""/><figcaption></figcaption></figure><p>저는 <strong>스티븐 친 (Stephen Chin)</strong> 씨의 어시스턴트를 맡았습니다. 취미로 목공을 하는 분인데, 이번 교환 행사에는 직접 만든 특별한 티피 탑(tippe top, 뒤집히는 팽이)을 가져오셨습니다. 저는 교환 퍼즐로 가득 찬 가방을 들고 스티븐 씨를 따라다니며 교환을 완료한 참가자 명단을 체크했습니다. 스티븐 씨는 여깄는 사람들 모두가 가족이나 마찬가지라면서, 참가자들에게 농담도 하고 제게 이런저런 이야기도 들려주었습니다. 덕분에 정말 많은 퍼즐러들을 만날 수 있었습니다.</p><p>한창 교환 퍼즐을 나눠주다가, 제가 명단을 체크하는 데 쓰던 볼펜을 가리키며 사실 그것도 자기가 만든 퍼즐 상자라고 알려줬습니다. 퍼즐을 풀면 숨은 다이아몬드를 찾을 수 있다고 합니다. 평범하게 작동하는 볼펜이었기에 의심조차 못 했는데, 정말 깜짝 놀랐습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/5407fe5e598c0f4a416be83ec6a0327628480a97-4874x3659.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/5407fe5e598c0f4a416be83ec6a0327628480a97-4874x3659.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/97ac55d7557a940b0ecf921e1a8e052d78025e11-4032x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/97ac55d7557a940b0ecf921e1a8e052d78025e11-4032x3024.png" alt=""/><figcaption></figcaption></figure><p>모든 교환 행사 참가자들은, 인디애나 대학교 릴리 도서관에 있는 “제리 슬로컴 퍼즐 컬렉션 (Jerry Slocum Puzzle Collection)”에 교환 퍼즐을 하나씩 기증해야 합니다. 퍼즐 교환 행사가 단순한 일회성 이벤트가 아니라, 퍼즐의 역사를 보존하고 이어 가려는 전통의 일부라는 점이 참 뜻깊게 다가왔습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/d7b3db247b3801cf39b555a3f2354b339ce64b50-3729x2796.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/d7b3db247b3801cf39b555a3f2354b339ce64b50-3729x2796.png" alt=""/><figcaption></figcaption></figure><p>교환 행사가 끝난 뒤에는 퍼즐 디자인 경연대회(Puzzle Design Competition)의 출품작들이 있는 방에서 시간을 보냈습니다. IPP 기간 내내 열려 있어서 언제든지 들어가서 작품들을 가지고 놀 수 있었습니다. 출품작 중에서는 <strong>Chained Frames</strong>가 가장 인상 깊었습니다. 투박해 보이는 외관과 달리 아름다운 움직임의 연속으로 해결되는 퍼즐입니다. 옆에 앉았던 하나야마 직원 오니시 타케시 (Takeshi Onishi) 씨에게 강력 추천할 수밖에 없었습니다. 언젠가 하나야마에서 캐스트 퍼즐로 발매해 주지 않을까요?</p><p>그 밖에 기억에 남은 퍼즐로는 (순서에 상관없이) <strong>Diagonal Twins, Rombox, Fudge, Tetromino Island, Toaster, Star Puzzle</strong>, ... 등이 있었습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/39731ea285fa3b25416066a1f62324b899a55ec2-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/39731ea285fa3b25416066a1f62324b899a55ec2-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/1d918de03f8eaf4363e2292585f29ef8809639c3-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/1d918de03f8eaf4363e2292585f29ef8809639c3-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/c3c00f0e84a4fd1f104a5e9892615d5320c112cb-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/c3c00f0e84a4fd1f104a5e9892615d5320c112cb-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/338d630bfdfb2c119f1a974c4d793e8386153763-4284x5712.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/338d630bfdfb2c119f1a974c4d793e8386153763-4284x5712.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/19cd2dd7e4b1f7f97a2a5ba6b721895d36c7e191-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/19cd2dd7e4b1f7f97a2a5ba6b721895d36c7e191-5712x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/c4a791993c9ee2d535619b52a96928abe122f9d4-5712x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/c4a791993c9ee2d535619b52a96928abe122f9d4-5712x4284.png" alt=""/><figcaption></figcaption></figure><p>저녁에는 마술 공연과 함께하는 연회가 열렸고, 내년에 열릴 IPP에 대한 발표가 있었습니다. 마술 공연 중에는 큐브를 이용한 마술이 있었는데, 큐브를 맞출 수 있는 사람이 있냐는 질문에 유창현 씨가 자원해서 큐브를 맞추기도 했습니다.</p><iframe title="YouTube Embed" src="https://www.youtube.com/embed/KurI9E5zMsc" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" class="aspect-video w-full"></iframe><p>그렇게 2일차 일정이 마무리되었습니다.</p><p></p><ul><li><strong>2편 읽기:</strong> <a href="https://blog.queuedlab.com/posts/ipp-42-tokyo-2">IPP 42 도쿄 — (2)</a></li></ul>]]></content>
        <author>
            <name>queuedlab</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[KPP 2025.08]]></title>
        <id>https://blog.queuedlab.com/posts/2025-08-kpp</id>
        <link href="https://blog.queuedlab.com/posts/2025-08-kpp"/>
        <updated>2025-08-02T13:00:00.000Z</updated>
        <summary type="html"><![CDATA[「루빅 80/50 마법의 50년」 전시와 함께한 KPP 모임]]></summary>
        <content type="html"><![CDATA[<p>이번 KPP 퍼즐 모임에서는 한국국제교류재단과 주한헝가리대사관에서 주최한 “루빅 80/50 마법의 50년“ 전시에 다녀왔습니다. 이충명씨가 대여한 특수 큐브들을 포함해서 다양한 큐브들이 전시되어 있어서 눈이 즐거웠습니다 😊 다른 발명가 분들의 창작 큐브들도 몇 점 있었는데 디자인이 독특해서 흥미로웠습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/3dc1ab938ed02896d1170998fe4fe860addcf831-4284x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/3dc1ab938ed02896d1170998fe4fe860addcf831-4284x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/e2615ea001a7ea6fc66b6cd392d7ea09fc3e9233-4284x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/e2615ea001a7ea6fc66b6cd392d7ea09fc3e9233-4284x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/ca2271402196e8b38c6412e8c0b5d110fc67f31f-4284x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/ca2271402196e8b38c6412e8c0b5d110fc67f31f-4284x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/d5e5d8154b8f9c46ddd43e703a92e0b85fd47afe-4284x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/d5e5d8154b8f9c46ddd43e703a92e0b85fd47afe-4284x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/b3ffb7c5aa436d00ac99c77e2d3adfe130afea51-3024x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/b3ffb7c5aa436d00ac99c77e2d3adfe130afea51-3024x3024.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/59fad9375d3b2ce936056de20a14dcbb5f3bb234-3024x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/59fad9375d3b2ce936056de20a14dcbb5f3bb234-3024x3024.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/dda1b319a0596fa5b33bf3105ba38a198ce72883-4284x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/dda1b319a0596fa5b33bf3105ba38a198ce72883-4284x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/77741e9bfdfadb5f70e9e3655bd3141a3bc5386a-4859x3644.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/77741e9bfdfadb5f70e9e3655bd3141a3bc5386a-4859x3644.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/bae19b4c42f094933b46439b5160f7e2558e5718-3024x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/bae19b4c42f094933b46439b5160f7e2558e5718-3024x3024.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/5a663fa3bc8052aadae02e76738420efbde050a8-4284x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/5a663fa3bc8052aadae02e76738420efbde050a8-4284x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/0e296deb529593597a0928e9ab1e349662ab5b40-4284x4284.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/0e296deb529593597a0928e9ab1e349662ab5b40-4284x4284.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/ada8f0d730b58bdaab397c060fbd3880aae1457c-3024x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/ada8f0d730b58bdaab397c060fbd3880aae1457c-3024x3024.png" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/1949438acbe1b0efab6e5daa3a6b201453a05015-3024x3024.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/1949438acbe1b0efab6e5daa3a6b201453a05015-3024x3024.png" alt=""/><figcaption></figcaption></figure>]]></content>
        <author>
            <name>queuedlab</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Canal 퍼즐]]></title>
        <id>https://blog.queuedlab.com/posts/canal-puzzle</id>
        <link href="https://blog.queuedlab.com/posts/canal-puzzle"/>
        <updated>2025-05-11T10:39:13.653Z</updated>
        <summary type="html"><![CDATA[Canal은 조각이 이루는 빈 공간을 활용한 퍼즐입니다. 틀 안에 흰 조각을 놓아서 파란색 경로를 만드는 것이 목표입니다. 저(한동규)의 작품입니다.]]></summary>
        <content type="html"><![CDATA[<link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/5f1ec15aa7ba03538149c0c3756faf853b1c0dea-886x886.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/5f1ec15aa7ba03538149c0c3756faf853b1c0dea-886x886.jpg" alt=""/><figcaption></figcaption></figure><p><strong>디자인</strong> _ 한동규 (2021)</p><p><strong>제품 생산</strong> _ Rex Rossano Perez (2024)</p><p><strong>퍼즐 목표</strong> _ 네 개의 조각을 틀 안에 놓아서, 두 점을 잇는 1칸 너비의 파란 경로를 만들어야 한다. 경로에 꼭 필요하지 않은 파란 칸이 보여서는 안 된다.</p><p><strong>구매하기</strong> _ <a href="https://teamjbhobbies.com/products/canal-han-dongkyu-rex-rossano-perez">https://teamjbhobbies.com/products/canal-han-dongkyu-rex-rossano-perez</a></p><hr/><p>Canal은 특별한 목표를 가진 퍼즐을 만들겠다는 시도에서 탄생했습니다. 평범한 패킹 퍼즐처럼 생겼지만, 목표는 퍼즐 조각이 아니라 빈 공간에 있습니다. 하얀 조각을 놓아서 두 점을 잇는 1칸 너비의 파란 경로를 만들어야 하죠.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/dad923cb3350fb43d1290aad35c1641de37bc07c-886x886.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/dad923cb3350fb43d1290aad35c1641de37bc07c-886x886.jpg" alt=""/><figcaption>이 배치는 경로에 꼭 필요하지 않은 칸이 보이므로 실패입니다.</figcaption></figure><p>2022년에 이 작품을 페이스북에 업로드하면서, “유일해인지는 모르겠다”고 덧붙였습니다. 감사하게도 몇몇 페친 분들이 퍼즐을 즐겨 주셨고, 그중에는 Symen Hovinga 씨도 있었습니다. Symen 씨는 퍼즐의 해답이 유일함을 검증하는 파이썬 코드도 보내 주셨습니다. (George Sicherman 씨도 독립적으로 유일해를 검증해 주셨습니다.)</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/3f7afa1f1198aa96ecabd72e1bb0d18cd3c1a116-3200x1600.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/3f7afa1f1198aa96ecabd72e1bb0d18cd3c1a116-3200x1600.png" alt=""/><figcaption>페이스북을 통해 처음 공개한 이미지 (수정본)</figcaption></figure><p>퍼즐이 생산되었을 때 감사의 말을 전하고 싶었지만, Symen Hovinga 씨는 안타깝게도 2023년에 세상을 떠나셔서 더 이상 전할 수 없게 되었습니다. 그의 독창적인 패킹 퍼즐 디자인은 늘 제게 많은 영감이 되었습니다. 고인의 명복을 빕니다.</p><p>시간이 흘러 2024년, Rex Rossano Perez 씨가 제 퍼즐을 생산하고 싶다고 제안해 왔습니다. 그는 이미 제 친구 조정휘(Albert Joe)의 퍼즐을 생산한 적 있어서 곧장 제안을 수락했습니다. Canal 퍼즐이 드디어 실물화되어 전 세계 사람들에게 닿을 수 있다는 사실에 기뻤습니다.</p><p>Canal을 배송받기 전, 12월에는 퍼즐 디자이너 이와사와 히로카즈(Iwahiro) 씨와 하나야마의 GM 오니시 타케시 씨가 게스트로 참석한 <a href="https://blog.queuedlab.com/posts/2024-12-kpp">KPP 모임이 열렸습니다</a>. 제 친구에게 부탁해 Canal 퍼즐의 3D 프린트 프로토타입을 만들었고, 게스트 분들께 선물로 드렸습니다. Iwahiro 씨는 30분 정도 고민해서 풀더니 멋진 퍼즐이라는 칭찬을 남겨 주셨습니다!</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/0eda722980a755831b64bf83aeb5aa3715387402-4032x3024.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/0eda722980a755831b64bf83aeb5aa3715387402-4032x3024.jpg" alt=""/><figcaption>Iwahiro 씨와 오니시 타케시 씨에게 선물한 Canal 프로토타입</figcaption></figure><p>Canal을 배송받는 김에 Rex 씨가 생산한 다른 퍼즐들도 함께 구매하겠다고 했는데, 특히 품절되었던 Copy Device를 손에 넣고 싶었기 때문이었습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/6928ac068a8c74a410ca6d79485bc41c855bf5d5-4284x4284.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/6928ac068a8c74a410ca6d79485bc41c855bf5d5-4284x4284.jpg" alt=""/><figcaption>Canal과 함께 구매한 퍼즐들</figcaption></figure><p>Hiroshi Yamamoto의 Copy Device는, 단 세 개의 단순한 조각만으로 이렇게 까다로운 퍼즐을 만들었다는 점에 감격했던 작품인데요, Canal 퍼즐의 영감 중 하나이기도 합니다. 두 퍼즐 모두 빈 공간(negative space)을 활용해 특정한 형태를 만드는 것을 목표로 하고 있습니다.</p><p>Rex 씨는 제가 원하는 색 조합을 직접 고르라는 멋진 제안을 주셨고, 저는 Canal과 같은 색 조합을 택했습니다. 덕분에 세상에서 단 하나뿐인 Copy Device 퍼즐을 소장하게 되었죠!</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/c21aedc32620644db7c0dc68846e28b23bb9a900-3024x3024.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/c21aedc32620644db7c0dc68846e28b23bb9a900-3024x3024.jpg" alt=""/><figcaption>Hiroshi Yamamoto의 Copy Device</figcaption></figure><p>또 Goh Pit Khiam의 Bottleneck도 함께 구매했고, Chris Enright의 Pack-Man 퍼즐은 Rex 씨가 선물로 보내주었습니다. 두 퍼즐 모두 꽤나 애를 먹었지만 재미있는 도전이었습니다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/a35e4262e9de5a3777ca36003b3e1d9cc7674e55-3024x3024.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/a35e4262e9de5a3777ca36003b3e1d9cc7674e55-3024x3024.jpg" alt=""/><figcaption>Goh Pit Khiam의 Bottleneck</figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/1be0114c6a31b0b6cc17e11da23be2aaf0e2e43d-3024x3024.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/1be0114c6a31b0b6cc17e11da23be2aaf0e2e43d-3024x3024.jpg" alt=""/><figcaption>Chris Enright의 Pack-Man</figcaption></figure><p>사진 속에는 이름 없는 퍼즐이 하나 더 있습니다. 이것도 제가 디자인한 퍼즐인데, 아직 공개하지 않은 작품입니다. 단순한 패킹 퍼즐처럼 생겼지만 마찬가지로 반전이 숨어 있습니다. 어떤 퍼즐인지 궁금하시다면, 계속 지켜봐 주세요!</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/f468c6fde6507b2a2b38cf005fff920ce78143c7-3024x3024.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/f468c6fde6507b2a2b38cf005fff920ce78143c7-3024x3024.jpg" alt=""/><figcaption>미공개 퍼즐</figcaption></figure><p>원문 보기: <a href="https://www.facebook.com/queuedq/posts/pfbid0QTE4uLMetctp9ior7Vsj7JhyLTCuEKpq3f6QNF3FZi8WRbbfiwBKp5561tHFyjLrl">Facebook</a></p>]]></content>
        <author>
            <name>queuedlab</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[MMXXV 거울 미로]]></title>
        <id>https://blog.queuedlab.com/posts/mmxxv-mirror-maze</id>
        <link href="https://blog.queuedlab.com/posts/mmxxv-mirror-maze"/>
        <updated>2025-01-11T11:33:00.000Z</updated>
        <summary type="html"><![CDATA[2025년 1월의 Horizon 퍼즐로 새해맞이 퍼즐을 만들었습니다. MMXXV 모양의 거울을 배치해서 거울 미로를 만들어 봅시다!]]></summary>
        <content type="html"><![CDATA[<link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/765de5630baeb34f0d11b3198de058d86c4c5bb7-2240x1280.png"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/765de5630baeb34f0d11b3198de058d86c4c5bb7-2240x1280.png" alt=""/><figcaption></figcaption></figure><p>2025년 새해맞이 퍼즐을 만들었습니다.</p><p>2025를 로마 숫자로 나타내면 MMXXV가 됩니다. 격자에 MMXXV 모양의 거울 구조물들을 설치해서, 격자 밖에서 쏜 레이저의 길이가 주어진 수들과 일치하도록 만들어 봅시다!</p><p><strong>문제 보러가기: <a href="https://horizon.kias.re.kr/30809/">[1월의 퍼즐] MMXXV 거울 미로</a></strong></p>]]></content>
        <author>
            <name>queuedlab</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[KPP 2024.12 (+ Iwahiro, Takeshi Onishi)]]></title>
        <id>https://blog.queuedlab.com/posts/2024-12-kpp</id>
        <link href="https://blog.queuedlab.com/posts/2024-12-kpp"/>
        <updated>2024-12-08T09:18:23.833Z</updated>
        <summary type="html"><![CDATA[퍼즐 디자이너 Iwahiro 씨와 하나야마의 오니시 타케시 씨가 KPP 모임에 방문해 주셨습니다.]]></summary>
        <content type="html"><![CDATA[<p>어제 퍼즐 디자이너 이와사와 히로카즈(Iwahiro) 씨와 하나야마의 GM 오니시 타케시 씨가 KPP(한국 퍼즐 파티)에 방문해 주셨습니다.</p><p>정말 값진 모임이었습니다! Iwahiro 씨는 캐리어 한가득 교환 퍼즐을 가져와 주셨고, 타케시 씨는 하나야마에서 준비 중인 프토로타입을 몇 개 보여주셨습니다.</p><p>저는 제 디자인인 Canal의 3D 프린트 프로토타입을 선물했습니다. 멋진 퍼즐이라는 칭찬을 받아서 기쁩니다! Iwahiro 씨는 본인의 Square in the bag 퍼즐을 신용카드 사이즈로 만들어 선물해 주셨습니다. 제가 갖고 있던 ODD puzzle에 사인도 받았습니다. ㅎㅎ</p><hr/><p>Puzzle designer Hirokazu Iwasawa (Iwahiro) and Hanayama&#x27;s GM Takeshi Onishi visited yesterday&#x27;s KPP (Korean Puzzle Party).</p><p>We had a great time! Iwahiro brought a suitcase full of exchange puzzles so there was plenty to enjoy. Mr. Onishi showed us some prototypes that Hanayama is working on.</p><p>I gave them my 3D printed prototypes of Canal as gifts. I&#x27;m glad they said it&#x27;s a great puzzle! Iwahiro gave us credit card-sized “Square in the bag” puzzles. I&#x27;m also happy to get his autograph on the ODD puzzle I have.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/d664101adf3865f8e43a6aad28ad262861bf871c-3813x2860.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/d664101adf3865f8e43a6aad28ad262861bf871c-3813x2860.jpg" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/c94c4672acc3c90fadc101d4fb7285cfb26bb924-3024x4032.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/c94c4672acc3c90fadc101d4fb7285cfb26bb924-3024x4032.jpg" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/d1d1a91118d82892419872bd071517f03b2305a2-4032x3024.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/d1d1a91118d82892419872bd071517f03b2305a2-4032x3024.jpg" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/c5dfa906677559866783668c3687f267fc4bd00d-4032x3024.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/c5dfa906677559866783668c3687f267fc4bd00d-4032x3024.jpg" alt=""/><figcaption></figcaption></figure><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/1ce0a58b4cc2e59cb9ac13ffabd4070c971de254-4032x3024.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/1ce0a58b4cc2e59cb9ac13ffabd4070c971de254-4032x3024.jpg" alt=""/><figcaption></figcaption></figure>]]></content>
        <author>
            <name>queuedlab</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[에러 메시지 쌓기]]></title>
        <id>https://blog.queuedlab.com/posts/exception-chaining</id>
        <link href="https://blog.queuedlab.com/posts/exception-chaining"/>
        <updated>2024-10-13T13:20:51.626Z</updated>
        <summary type="html"><![CDATA[에러 메시지를 풍부하게 만들어 주는 Exception chaining 기법]]></summary>
        <content type="html"><![CDATA[<p>소프트웨어 개발에서 에러 핸들링은 어떻게 하는 게 좋을까? 언어나 프로젝트, 어떤 종류의 에러인지에 따라 다르겠지만, 현재 내가 진행하고 있는 C++ 프로젝트에서는 어떤 에러든지 catch하면 메시지를 출력하고 즉시 종료하는 방법을 택했다. 상시 실행되는 서버 프로그램과 달리 일회성으로 실행되는 프로그램에서는 이것이 가장 단순명료한 방법일 것이다.</p><p>그런데 이렇게 출력한 한 줄짜리 에러 메시지만으로는 문제 해결에 도움이 되지 않는 경우가 있었다. 작은 유틸리티 함수에서 에러가 발생하면 어떤 작업을 하다가 에러가 발생했는지 알 수 없었고, 보다 큰 작업에서 에러가 발생하면 구체적인 원인을 찾기 어려웠다.</p><p>그렇다면 두 가지 에러 메시지를 다 보여줄 수는 없을까?</p><h2>한 줄짜리 에러 메시지의 문제</h2><p>예를 들어, XML 문법으로 프로그램 UI를 작성하는 기능을 만든다고 가정하자. 텍스트 박스 등의 UI 컴포넌트는 width나 color 따위의 속성을 가질 수 있다. 이때 color 속성이 <code>#RRGGBB</code> 형식을 따르지 않는 경우 에러를 throw하는 상황을 생각할 수 있다.</p><pre class="refractor language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>UI</span><span class="token punctuation">&gt;</span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>TextBox</span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>100<span class="token punctuation">&quot;</span></span> <span class="token attr-name">color</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>#7f7f7f<span class="token punctuation">&quot;</span></span> <span class="token punctuation">/&gt;</span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>TextBox</span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>50<span class="token punctuation">&quot;</span></span> <span class="token attr-name">color</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>100<span class="token punctuation">&quot;</span></span> <span class="token punctuation">/&gt;</span></span> <span class="token comment">&lt;!-- Error --&gt;</span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>UI</span><span class="token punctuation">&gt;</span></span></code></pre><p>이 같은 에러가 발생하는 상황에서 stack trace가 다음과 같다고 하자.</p><pre class="refractor language-text"><code class="language-text">ParseXML()
ParseComponent()
ParseAttribute()
...
ValidateColorString()</code></pre><p><code>ValidateColorString()</code> 은 아래의 에러 메시지를 throw할 것이다.</p><pre class="refractor language-text"><code class="language-text">&quot;100&quot; is not in the color string format &quot;#RRGGBB&quot;.</code></pre><p><strong>이 메시지만으로는 문제의 맥락을 파악할 수 없다.</strong> <code>&quot;100&quot;</code> 이 무엇을 가리키는지 모호하기 때문이다. 첫 번째 텍스트 박스에 있는 <code>width=&quot;100&quot;</code> 속성일까? 두 번째 텍스트 박스에 있는 <code>color=&quot;100&quot;</code> 속성일까? 심지어는 XML 파싱이 아닌 다른 작업을 하다가 <code>ValidateColorString()</code> 을 호출할 일이 생긴 것은 아닐까?</p><p>어떤 일을 하다가 에러가 발생했는지를 알기 위해서는 상위 단계에서 에러 메시지를 출력해 줘야 한다. <code>ParseXML()</code> 에서 모든 에러를 catch한다면 다음과 같은 에러 메시지를 다시 throw할 수 있다.</p><pre class="refractor language-text"><code class="language-text">An error occurred while parsing &quot;ui.xml&quot;.</code></pre><p><strong>이러면 맥락은 알 수 있겠지만 반대로 구체적인 원인을 알 수 없다.</strong> 더 깊숙한 곳에서 던진 에러를 확인해야만 한다.</p><p>한 가지 방법은 에러의 종류에 따라 클래스를 나누고 여러 개의 catch 블록을 놓는 것이다. 하지만 그러면 에러 처리 로직이 복잡해질 뿐만 아니라, 하위 함수들이 어떤 종류의 에러를 뱉는지도 세세히 알아야 한다. 기능 구현하기도 바쁜데 에러 처리까지 세심하게 신경써 주고 싶지는 않다. 모듈 간 결합도(coupling)가 증가하기 때문에 소프트웨어 디자인적 측면에서도 나쁘다.</p><h2>해결책: 에러 메시지 쌓기</h2><p>고민 끝에 내린 해결책은 하위에서 던진 에러 메시지를 버리지 않고 재활용하는 것이다. 하위 함수의 에러 메시지에 더 큰 맥락을 담은 새로운 에러 메시지를 쌓고 쌓아서, 여러 줄로 조합해 에러 메시지를 완성하는 것이다.</p><pre class="refractor language-text"><code class="language-text">[Error] An error occurred while parsing &quot;ui.xml&quot;.
- Invalid &lt;TextBox&gt; component at line 3.
- Invalid attribute value color=&quot;100&quot;.
- &quot;100&quot; is not in the color string format &quot;#RRGGBB&quot;.</code></pre><p>이를 구현하기 위해서 아래와 같이 메시지의 배열을 담은 <code>Error</code> 클래스를 만들었다. 이 클래스의 constructor는 현재 발생한 에러의 메시지 뿐만 아니라, 원인이 된 다른 <code>Error</code> 오브젝트를 받을 수 있다. 그리고 이 모든 에러 메시지들을 모아서 배열에 저장한다. (참고로 뒤에서 설명하겠지만 더 나은 구현 방법이 있다. 일단은 내가 처음에 구상한 방법을 설명한다.)</p><pre class="refractor language-cpp"><code class="language-cpp"><span class="token keyword">class</span> <span class="token class-name">Error</span> <span class="token operator">:</span> <span class="token base-clause"><span class="token keyword">public</span> <span class="token class-name">runtime_error</span></span> <span class="token punctuation">{</span>
<span class="token keyword">public</span><span class="token operator">:</span>
  <span class="token function">Error</span><span class="token punctuation">(</span><span class="token keyword">const</span> string <span class="token operator">&amp;</span>msg<span class="token punctuation">)</span> <span class="token operator">:</span> <span class="token function">runtime_error</span><span class="token punctuation">(</span>msg<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">msg_list_</span><span class="token punctuation">(</span><span class="token punctuation">{</span>msg<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
  <span class="token function">Error</span><span class="token punctuation">(</span><span class="token keyword">const</span> string <span class="token operator">&amp;</span>msg<span class="token punctuation">,</span> <span class="token keyword">const</span> exception <span class="token operator">&amp;</span>cause<span class="token punctuation">)</span> <span class="token operator">:</span> <span class="token function">Error</span><span class="token punctuation">(</span>msg<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">try</span> <span class="token punctuation">{</span>
      <span class="token keyword">const</span> <span class="token keyword">auto</span> <span class="token operator">&amp;</span>e <span class="token operator">=</span> <span class="token generic-function"><span class="token function">dynamic_cast</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token keyword">const</span> Error <span class="token operator">&amp;</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span>cause<span class="token punctuation">)</span><span class="token punctuation">;</span>
      msg_list_<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span>msg_list_<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
                       e<span class="token punctuation">.</span>msg_list_<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
                       e<span class="token punctuation">.</span>msg_list_<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token keyword">const</span> bad_cast <span class="token operator">&amp;</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      msg_list_<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>cause<span class="token punctuation">.</span><span class="token function">what</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>

  vector<span class="token operator">&lt;</span>string<span class="token operator">&gt;</span> msg_list_<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre><p>부연 설명을 하자면 <code>Error</code> 클래스 뿐만 아니라 표준 라이브러리에서 발생하는 에러들도 원인이 될 수 있으므로 인자로 <code>std::exception &amp;</code> 레퍼런스를 받았다. 그리고 <code>Error</code> 클래스의 인스턴스인지 확인하기 위해 <code>dynamic_cast</code> 를 활용했다. 에러 메시지를 앞의 예시처럼 출력하려면 <code>PrintErrorMessage()</code> 함수를 정의해서 사용한다.</p><pre class="refractor language-cpp"><code class="language-cpp"><span class="token keyword">void</span> <span class="token function">PrintErrorMessage</span><span class="token punctuation">(</span><span class="token keyword">const</span> exception <span class="token operator">&amp;</span>err<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">try</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> <span class="token keyword">auto</span> <span class="token operator">&amp;</span>e <span class="token operator">=</span> <span class="token generic-function"><span class="token function">dynamic_cast</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token keyword">const</span> Error <span class="token operator">&amp;</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span>err<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">for</span> <span class="token punctuation">(</span>size_t i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> e<span class="token punctuation">.</span>msg_list_<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      cerr <span class="token operator">&lt;&lt;</span> <span class="token punctuation">(</span>i <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">?</span> <span class="token string">&quot;[Error] &quot;</span> <span class="token operator">:</span> <span class="token string">&quot;- &quot;</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> e<span class="token punctuation">.</span>msg_list_<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token keyword">const</span> bad_cast <span class="token operator">&amp;</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    cerr <span class="token operator">&lt;&lt;</span> <span class="token string">&quot;[Error] &quot;</span> <span class="token operator">&lt;&lt;</span> err<span class="token punctuation">.</span><span class="token function">what</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><p>이제 에러가 발생한 catch 블록에서 아래와 같이 에러를 re-throw하면 된다.</p><pre class="refractor language-cpp"><code class="language-cpp"><span class="token keyword">void</span> <span class="token function">ValidateColorString</span><span class="token punctuation">(</span><span class="token keyword">const</span> string <span class="token operator">&amp;</span>str<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">if</span> <span class="token punctuation">(</span>str<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token char">&#x27;#&#x27;</span><span class="token punctuation">)</span>
    <span class="token keyword">throw</span> <span class="token function">Error</span><span class="token punctuation">(</span><span class="token string">&quot;Invalid color string: &quot;</span> <span class="token operator">+</span> str<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">void</span> <span class="token function">ParseComponentAttribute</span><span class="token punctuation">(</span><span class="token keyword">const</span> string <span class="token operator">&amp;</span>name<span class="token punctuation">,</span> <span class="token keyword">const</span> string <span class="token operator">&amp;</span>value<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">try</span> <span class="token punctuation">{</span>
    <span class="token function">ValidateColorString</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token keyword">const</span> exception <span class="token operator">&amp;</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">throw</span> <span class="token function">Error</span><span class="token punctuation">(</span><span class="token string">&quot;Invalid attribute: &quot;</span> <span class="token operator">+</span> name <span class="token operator">+</span> <span class="token string">&quot;=&quot;</span> <span class="token operator">+</span> value<span class="token punctuation">,</span> e<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">void</span> <span class="token function">ParseXML</span><span class="token punctuation">(</span><span class="token keyword">const</span> string <span class="token operator">&amp;</span>file_name<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">try</span> <span class="token punctuation">{</span>
    <span class="token function">ParseComponentAttribute</span><span class="token punctuation">(</span><span class="token string">&quot;color&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;100&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token keyword">const</span> exception <span class="token operator">&amp;</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">throw</span> <span class="token function">Error</span><span class="token punctuation">(</span><span class="token string">&quot;Invalid UI file: &quot;</span> <span class="token operator">+</span> file_name<span class="token punctuation">,</span> e<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">try</span> <span class="token punctuation">{</span>
    <span class="token function">ParseXML</span><span class="token punctuation">(</span><span class="token string">&quot;ui.xml&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token keyword">const</span> exception <span class="token operator">&amp;</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">PrintErrorMessage</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><pre class="refractor language-text"><code class="language-text">[Error] Invalid UI file: ui.xml
- Invalid attribute: color=100
- Invalid color string: 100</code></pre><p>짠! 에러 메시지를 쌓아서 에러가 발생한 맥락과 구체적인 원인을 한 눈에 볼 수 있게 되었다.</p><p>예시에서는 모든 함수에 try-catch문을 사용하였지만, 실제로는 맥락이 중요한 함수 몇 개에만 사용하는 것을 추천한다. 중간에 거치는 함수들에서는 그냥 에러가 자연스럽게 전파되도록 내버려 두자.</p><p>물론 이것은 내가 최초로 생각한 아이디어가 아니다. ChatGPT에게 물어보니 이 기법은 <a href="https://en.wikipedia.org/wiki/Exception_chaining">예외 체이닝(Exception Chaining)</a>으로 불린다고 한다. 왜 chaining이냐 하면, 보통은 내가 한 것처럼 메시지 배열을 들고 다니는 것이 아니라, 원인 에러에 대한 레퍼런스를 가지도록 구현하기 때문이다. 메시지를 출력할 때에는 재귀적으로 레퍼런스를 따라 내려가면서 출력하는 것이다. 이 방법이 조금 더 효율적이고 안전하다.</p><p>C++에서는 예외 오브젝트의 lifetime과 관련한 이슈 때문에 단순히 <code>exception &amp;</code> 레퍼런스나 <code>exception *</code> 포인터를 들고 있을 수는 없다. 대신 <code>std::exception_ptr</code> 라는 shared ownership을 가진 포인터를 이용해야 한다. 다행히도 우리가 직접 이런 걸 신경쓰면서 <code>Error</code> 클래스를 구현할 필요는 없다. C++11부터는 표준 라이브러리에서 <code>std::nested_exception</code> 클래스 및 관련 함수들을 통해 이 기능을 자체적으로 제공하고 있기 때문이다.</p><h2>C++11의 std::nested_exception</h2><p><a href="https://en.cppreference.com/w/cpp/error/nested_exception">레퍼런스 페이지</a>에 사용 예시가 잘 나와 있는데, 위 코드에 하나씩 적용해 보면 다음과 같다.</p><p>먼저 <code>PrintErrorMessage()</code> 는 다음과 같이 작성한다.</p><pre class="refractor language-cpp"><code class="language-cpp"><span class="token keyword">void</span> <span class="token function">PrintErrorMessage</span><span class="token punctuation">(</span><span class="token keyword">const</span> exception <span class="token operator">&amp;</span>e<span class="token punctuation">,</span> <span class="token keyword">int</span> level <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  cerr <span class="token operator">&lt;&lt;</span> <span class="token punctuation">(</span>level <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">?</span> <span class="token string">&quot;[Error] &quot;</span> <span class="token operator">:</span> <span class="token string">&quot;- &quot;</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> e<span class="token punctuation">.</span><span class="token function">what</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
  <span class="token keyword">try</span> <span class="token punctuation">{</span>
    <span class="token function">rethrow_if_nested</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token keyword">const</span> exception <span class="token operator">&amp;</span>nested<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">PrintErrorMessage</span><span class="token punctuation">(</span>nested<span class="token punctuation">,</span> level <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    cerr <span class="token operator">&lt;&lt;</span> <span class="token string">&quot;Unknown error&quot;</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><p><code>std::rethrow_if_nested()</code> 함수는 인자가 <code>nested_exception</code> 인지 확인하고, 만약 그렇다면 내부에 있는 에러를 다시 throw하는 함수이다. 이 함수 덕분에 <code>dynamic_cast</code> 를 호출할 필요 없이 코드가 좀 더 간결해진 것을 볼 수 있다.</p><p>catch 블록에서는 <code>throw Error()</code> 대신 <code>std::throw_with_nested()</code> 함수를 사용한다.</p><pre class="refractor language-cpp"><code class="language-cpp"><span class="token function">throw_with_nested</span><span class="token punctuation">(</span><span class="token function">runtime_error</span><span class="token punctuation">(</span><span class="token string">&quot;Error message&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>여기서 에러 메시지를 인자로 넘겨주는 것이 아니라 <code>std::runtime_error</code> 를 사용하는 이유는 <code>nested_exception</code> 이 단일 클래스가 아니라 mixin 클래스이기 때문이다. <code>runtime_error</code> 클래스를 nesting이 가능하게 업그레이드하여 throw한다고 생각하면 된다. <code>runtime_error</code> 뿐만 아니라 다른 표준 에러 클래스를 사용할 수도 있어서 적절한 것을 선택하면 된다.</p><p>예시 코드에 적용해 보면 다음과 같다.</p><pre class="refractor language-cpp"><code class="language-cpp"><span class="token keyword">void</span> <span class="token function">ValidateColorString</span><span class="token punctuation">(</span><span class="token keyword">const</span> string <span class="token operator">&amp;</span>str<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">if</span> <span class="token punctuation">(</span>str<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token char">&#x27;#&#x27;</span><span class="token punctuation">)</span>
    <span class="token keyword">throw</span> <span class="token function">runtime_error</span><span class="token punctuation">(</span><span class="token string">&quot;Invalid color string: &quot;</span> <span class="token operator">+</span> str<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">void</span> <span class="token function">ParseComponentAttribute</span><span class="token punctuation">(</span><span class="token keyword">const</span> string <span class="token operator">&amp;</span>name<span class="token punctuation">,</span> <span class="token keyword">const</span> string <span class="token operator">&amp;</span>value<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">try</span> <span class="token punctuation">{</span>
    <span class="token function">ValidateColorString</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token keyword">const</span> exception <span class="token operator">&amp;</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">throw_with_nested</span><span class="token punctuation">(</span>
        <span class="token function">runtime_error</span><span class="token punctuation">(</span><span class="token string">&quot;Invalid attribute: &quot;</span> <span class="token operator">+</span> name <span class="token operator">+</span> <span class="token string">&quot;=&quot;</span> <span class="token operator">+</span> value<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">void</span> <span class="token function">ParseXML</span><span class="token punctuation">(</span><span class="token keyword">const</span> string <span class="token operator">&amp;</span>file_name<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">try</span> <span class="token punctuation">{</span>
    <span class="token function">ParseComponentAttribute</span><span class="token punctuation">(</span><span class="token string">&quot;color&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;100&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token keyword">const</span> exception <span class="token operator">&amp;</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">throw_with_nested</span><span class="token punctuation">(</span><span class="token function">runtime_error</span><span class="token punctuation">(</span><span class="token string">&quot;Invalid UI file: &quot;</span> <span class="token operator">+</span> file_name<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">try</span> <span class="token punctuation">{</span>
    <span class="token function">ParseXML</span><span class="token punctuation">(</span><span class="token string">&quot;ui.xml&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token keyword">const</span> exception <span class="token operator">&amp;</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">PrintErrorMessage</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><pre class="refractor language-text"><code class="language-text">[Error] Invalid UI file: ui.xml
- Invalid attribute: color=100
- Invalid color string: 100</code></pre><p>회사에서 새롭게 진행하고 있는 프로젝트에 이 방법을 적용해 보고 있는데 확실히 장점이 체감된다.</p><ul><li>구체적인 맥락이나 원인은 다른 에러가 대신해 주므로 에러 메시지를 간결하게 쓸 수 있었다.</li><li>에러 메시지만을 위해 함수에서 불필요한 정보에 접근할 필요가 없어져서, 캡슐화 및 결합도 감소에 도움이 되었다.</li><li>늘 헷갈렸던 에러 처리에 신경을 덜 써도 돼서 메인 로직 개발에 집중할 수 있게 되었다.</li></ul><p>앞으로 애용해야겠다.</p>]]></content>
        <author>
            <name>queuedlab</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2023 현대모비스 알고리즘 경진대회 “1등” 후기]]></title>
        <id>https://blog.queuedlab.com/posts/mobis-2023-1st-place-review</id>
        <link href="https://blog.queuedlab.com/posts/mobis-2023-1st-place-review"/>
        <updated>2024-06-28T11:00:40.535Z</updated>
        <summary type="html"><![CDATA[스코어보드 프리즈 전에 32등이었던 내가 1등이라고? 박진감 넘치는 현대모비스 알고리즘 대회 후기]]></summary>
        <content type="html"><![CDATA[<p>오랜만에 블로그 글을 씁니다! 곧 <a href="https://career.programmers.co.kr/competitions/3980">24년 현대모비스 알고리즘 경진대회</a>가 열린다는 소식을 듣고, 23년 대회 후기는 적어도 24년 대회가 시작하기 전에는 완성해야 하지 않나 싶어서 호다닥 글을 써 봅니다. 대회에 출제하거나 참가할 때마다 후기글을 쓰겠다고 다짐하지만 다른 일을 신경쓰느라 바빠서 못 쓴 글이 많습니다. 이 글을 시작으로 밀린 후기글을 조금씩 써 나가려고 합니다…</p><p>인생 처음으로 대회에서 1등을 했는데 그 기록을 남기고 싶기도 했고, 본선 대회 경험이 다이나믹하고 박진감 넘쳤기에(?) 여러분께 공유해 드리고 싶었습니다. 재밌게 읽어 주세요!</p><hr/><p>21, 22년 이후로 세 번째 열리는 <a href="https://career.programmers.co.kr/competitions/3419">23년 현대모비스 알고리즘 경진대회</a>에 참가했다. 22년에는 학생부로 나갔는데 이번에는 졸업하고 회사에 다니게 되어서 일반부로 출전했다.</p><h2>예선</h2><ul><li>예선은 6월 23일 14시부터 17시까지 진행되었다. <a href="https://school.programmers.co.kr/learn/challenges?order=recent&amp;partIds=49441">예선 문제 보러가기</a></li></ul><p>22년 예선 때와 달라진 점은 플랫폼이 구름에서 프로그래머스로 바뀌었다는 점이다. 로컬 환경을 못 쓰고 웹에서 코딩을 해야 한다는 점은 같았지만, 웹 에디터가 구름보다는 사용하기 편했던 것 같다.</p><p>22년에는 예선날 컨디션이 안 좋기도 했고, 문제 하나를 복잡하게 생각해서 구현을 다 못하고 예선에서 떨어졌다. 이번에는 컨디션도 괜찮고 실력도 좀 늘어서 만점을 목표로 생각하고 대회에 임했다.</p><p>그런데 문제가 생각보다 어려웠다. 1번에 조금 까다로운 백트래킹 문제가 나와서 더 간단한 풀이가 있는지 의심했고, 구현에 시간이 좀 걸렸던 것 같다. 2번에 에어컨 온도 조절하는 문제가 있었는데 그리디하게 접근하다 케이스워크가 엄청 복잡하게 나와서 한참 시간을 썼다. 아무리 생각해도 2번 문제라기엔 너무 어려운 것 같아서 접근을 바꿨고 다행히도 DP로 접근하니 쉽게 풀렸다. 아마 그리디로 접근하면 DP 풀이보다 효율적인 시간복잡도로 해결이 가능할 것으로 보인다.</p><p>3번은 행렬 거듭제곱 DP, 4번은 적당한 자료구조 설계 문제였다.</p><p>1, 2번에서 시간을 많이 쓴 나머지 4번 문제의 풀이를 떠올렸지만 구현을 마무리하지 못하고 대회가 종료되었다. 다행히도 세 문제 만점을 받아서 본선 진출에는 성공했다. 본선에는 학생부와 일반부 각 50명씩 진출했다.</p><h2>본선</h2><ul><li>본선은 7월 7일 13시부터 16시까지 코엑스에서 진행되었다. <a href="https://school.programmers.co.kr/learn/challenges?order=recent&amp;partIds=49442">본선 문제 보러가기</a></li></ul><p>예선과 본선 모두 하필 금요일이라 휴가를 내고 대회에 참가했다.</p><h3>서울 일러스트레이션 페어</h3><p>대회 당일 마침 코엑스에서 서울 일러스트레이션 페어가 열리고 있어서 아침 일찍 출발했다. 서일페 참가는 두 번째인데, 매번 그 긴 줄이 빠르게 줄어드는 것을 보며 티켓 배부 방식이 매우 효율적이라는 생각이 들어 감탄이 나왔다.</p><p>서일페에 참가한 목적은 내가 카카오톡 놀자곰 이모티콘을 만든 메밀 작가님의 팬이어서 놀자곰 부스를 방문하기 위함이었다. (ㅋㅋ) 추가로 놀자곰 굿즈와 망붕이 굿즈를 요청한 친구들이 있어서 빠르게 부스를 돌고 왔다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/4d0e6a9ea724e6008746b07727fd9ab9feae2b45-1024x768.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/4d0e6a9ea724e6008746b07727fd9ab9feae2b45-1024x768.jpg" alt=""/><figcaption>서일페에서 산 놀자곰과 망붕이 굿즈</figcaption></figure><p>넙죽이 굿즈와 꿈돌이 굿즈를 파는 부스도 있어서 신기했다. 도구리가 주최자 사무실에 들어가려는데 머리가 커서 문에 끼는 재밌는 광경도 목격했다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/628f7ace8822c0326fb08a4a9e25ff7e0caa63ac-768x1024.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/628f7ace8822c0326fb08a4a9e25ff7e0caa63ac-768x1024.jpg" alt=""/><figcaption>머리가 커서 슬픈 도구리</figcaption></figure><h3>대회 시작 전</h3><p>함께 본선에 진출한 친구(goodgood123)와 만나서 점심을 때우고 대회장에 들어갔다.</p><p>학생부와 일반부 각 1명씩, 2인 1책상을 사용했는데 앉고 보니 koosaga님 옆자리였다. 대회 출제하면서 몇 번 만난 적이 있어서 가벼운 잡담을 했다. “1등 하러 오셨군요~” 라고 하니까 그런 말 하지 말라고 하셨다. ㅋㅋㅋ</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/37fc31312e49f17129d3a76c3d96f6c6e3607540-1024x768.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/37fc31312e49f17129d3a76c3d96f6c6e3607540-1024x768.jpg" alt=""/><figcaption>대회장 풍경</figcaption></figure><h3>대회 시작</h3><p>본선 대회가 시작됐다. (스포일러 주의, 타임라인은 부정확할 수 있음)</p><p>1번 문제부터 숨이 턱 막혔다. 배열의 순서를 잘 섞어서 이웃한 원소 차의 최솟값을 최대화하는 문제였다. 비슷하게 생긴 문제를 본 적 있어서 대충 그리디하게 배열하면 될 줄 알았는데, 배열 길이가 홀수일 때의 풀이가 생각나지 않았다. 정말 이것만 붙잡고 한참을 고민했는데, 어쩔 수 없이 길이가 짝수인 경우의 풀이를 변형해서 부분점수<strong>(10.2/15점)</strong>만 긁었다. 이때까지 한 40분 넘게 썼다. 1번 문제부터 만점을 못 받아서 좌절하며 다음 문제로 넘어가기로 했다…</p><p>이미 시간을 많이 허비해서 일단 풀 수 있는 것부터 푸는 것으로 전략을 바꿨다. 남은 2, 3, 4번 문제를 대강 읽어봤는데 2번이 제일 생각하기는 편해 보였다.</p><p>2번 문제는 일단 최단 경로 그래프를 만들어서 푸는 유형이라는 게 보였다. 풀이를 완성하지 않고 바로 구현에 들어갔는데, 구현하면서 보니 생각보다 케이스워크도 많이 필요하고 구현량도 많았다. 이 문제만 잡다가는 3번을 고민할 새도 없이 대회가 끝날 것 같다는 생각에 잠시 3번 문제를 고민하러 갔다.</p><p>3번 문제는 어디선가 본 듯한 문제였다. 우선 SCC를 압축하면 Path cover 문제가 되어 이분 매칭으로 풀면 될 것 같았다. 종이에 몇 가지 예제를 그려 봤다. SCC와 이분 매칭 코드가 잘 기억이 나지 않아서 헤맸지만 바로 구현을 시작했고 2번보다 먼저 코드를 완성했다.</p><p>그런데 예제에 대한 답조차 나오지 않았다. 자세히 보니 Path cover 문제와는 약간 다른 형태였다. Path cover에서는 경로끼리 겹치지 않아야 하는데, 이 문제에서는 경로가 겹쳐도 되기 때문이다. 예제를 단순화한 반례 데이터와 그 옆에 물음표 두 개를 그려 놓고 이걸 어떻게 해결해야 하나 고민하다가 포기하고 2번으로 돌아갔다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/ace1524ed77ee4ce21db5b5bd1ba89ecaaac6bed-4032x3024.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/ace1524ed77ee4ce21db5b5bd1ba89ecaaac6bed-4032x3024.jpg" alt=""/><figcaption>대회에서 사용한 연습지</figcaption></figure><h3>스코어보드 프리즈</h3><p>그렇게 2시간째, 스코어보드가 프리즈됐다. <strong>나는 1번 부분점수만 긁은 채 50명 중 32등에 위치해 있었다…</strong> 목표인 아이패드를 받으려면 25등 안에 들어야 하는데, 이대로 문제를 더 풀지 못하면 40등 밖으로 밀려나 장려상인 갤럭시 버즈 프로조차 받지 못할 위험에 처했다.</p><p>선택과 집중을 해야 할 때가 왔다. 우선 아이디어가 떠오르지 않는 3번 대신 풀이가 대강 보이는 2번을 구체화했다. 예외 케이스들을 다 처리하고 나면 단절선을 구해서 간단하게 해결할 수 있을 텐데, 문제는 단절선 알고리즘을 실수 없이 빠르게 구현할 자신이 없었다. 그래프의 특성상 스위핑 한 번으로 단절선을 구할 방법이 있을 것이라고 생각해서 그 방향으로 접근을 바꿨다.</p><p>그렇게 열심히 구현을 완성했고 <strong>다행히도 한 방에 만점(20/20점)을 받았다!</strong> 이제 남은 시간은 40분.</p><p>다시 3번 문제를 보니, 경로들이 겹쳐 있다면 겹친 정점들을 건너 뛰어서 새롭게 경로를 구축할 수 있을 거란 생각이 들었다. 그러면 경로들이 겹치지 않게 되므로 Path cover 문제로 환원할 수 있다. 이렇게 하기 위해서는 각 정점에서 도달 가능한 정점들에 전부 간선을 이어 주면 되고, 이건 Floyd-Warshall 알고리즘으로 간단하게 해결할 수 있는 문제이다.</p><p>다행히도 코드의 나머지 부분은 완성되어 있었고, 다른 곳을 건드릴 필요도 없이 Floyd-Warshall 알고리즘만 추가하면 됐기 때문에 <strong>빠르게 만점(30/30점)을 받을 수 있었다!</strong> 이제 남은 시간은 30분.</p><p>남은 시간동안 4번 문제를 푸는 건 불가능했기 때문에 빠르게 부분점수만 긁기로 했다. 딱 보니까 세그트리를 쓰는 어려운 스위핑 문제로 보였는데, 2차원 누적합을 쓰면 작은 입력에 대해서는 해결이 가능하기 때문에 빠르게 짜고 부분점수<strong>(4.9/35점)</strong>을 받았다.</p><p>남은 15분 동안 안도의 한숨을 내쉬며 4번 문제의 부분점수를 더 긁을 방법을 고민하다 대회가 끝났다.</p><h3>대회 종료</h3><p>시상식 전까지 쉬는 시간을 가졌다.</p><p>일단 목표했던 아이패드는 받을 수 있겠다는 생각에 마음 놓고 돌아다녔다. 대회 출제나 기타 등등으로 알게 된 kdh9949님, leo020630님, man_of_learning님, serin님, sait2000님을 만났다. 푼 문제를 공유하다 보니 내가 생각보다 잘 푼 것 같아서, 높은 등수까지도 기대할 수 있겠다는 희망이 생겼다…!</p><p>koosaga님은 1번을 긁고 나머지를 다 풀었다고 하셨다. 역시 1번은 어려운 문제가 맞다…</p><p>현대모비스 홍보 세션 뒤에 시상식이 시작됐다. 학생부부터 발표를 했는데, 역시나 1번 빼고 올솔브를 하신 koosaga님이 1등을 차지하셨다.</p><p>그리고 대망의 일반부 발표가 있었다. 3등부터 발표를 했는데 3등, 2등에도 내 이름이 없었다. 기대 반, 설마 반이었다. <strong>그리고… 1등으로 내 이름이 불렸다!</strong> 기대하지 않았던 결과라 믿기지 않으면서도 그동안의 꾸준함이 결실을 맺었다는 생각이 들었다.</p><p>koosaga님이 한 책상에서 1등 두 명이 나와서 치팅이라고 의심받을 거라는 농담을 했다. ㅋㅋㅋ</p><p>우수상과 장려상 수상자 발표까지 마치고, 우승자들은 다시 단상 위로 올라 트로피를 받고 사진을 찍었다.</p><p>진행자 분께서 1등 소감을 말해달라고 하셨다. 다들 알다시피 현대모비스 알고리즘 대회에서 1등을 하면 차를 주는데 (23년은 스포티지 하이브리드) 나는 면허가 없다. 짧고 굵게 <strong>“무면허 운전 잘 하겠습니다!”</strong> 라고 외쳤다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/f6b04d6c2d692cbdb6e534ac7f1dbf6b2dbc181a-1024x768.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/f6b04d6c2d692cbdb6e534ac7f1dbf6b2dbc181a-1024x768.jpg" alt=""/><figcaption>금상 트로피!</figcaption></figure><h3>시상식 이후</h3><p>시상식이 끝나고 마무리로 단체 사진을 찍었다. 일반부와 학생부에서 각각 1등상을 차지한 나와 koosaga님은 따로 밖에 나와서 같이 트로피를 들고 사진을 찍었다.</p><p>알고 보니 koosaga님도 첫 대회 1등이라고 하셨다. 사진 찍는 게 어색하셨는지 사진사 분께서 좀 더 당당하게 포즈를 잡아보라고 하셨다. ㅋㅋㅋ 아쉽게도 트로피를 들고 찍은 사진은 기사에 안 쓰였지만 나중에 내 이름이 기사에 나왔다. 3등 이내 우승자들은 따로 모여서 상금 계약서 같은 걸 작성하고 대회 일정이 마무리되었다.</p><ul><li><a href="https://www.fnnews.com/news/202307091508475160">현대모비스 SW경진대회 1등은...삼성전자 한동규·카이스트 구재현씨</a></li></ul><p>koosaga님을 따라 뒤풀이를 갔다. edenooo님, stonejjun03님, moraeduji님을 만났다. (몇 분 더 계셨는데 잘 기억이 안 난다…) edenooo님이 3번 문제 어디서 본 것 같지 않냐고 하셨는데, 알고 보니 예전에 참여했던 kyo20111님의 랜덤 플래티넘 디펜스 연습에서 <a href="https://www.acmicpc.net/problem/3547">비슷한 문제</a>가 나왔고 풀이를 논의한 적이 있었다…! 3번을 푸는 데에 무의식 중에 도움이 되었을지도 모르겠다는 생각이 들었다.</p><p>대회 얘기, 출제 썰 등을 이야기하며 식사를 하고 나랑 koosaga님은 1등 기념으로 각자가 앉은 테이블을 쐈다. 그렇게 하루가 끝났다.</p><link rel="preload" as="image" href="https://cdn.sanity.io/images/ze3fm6cq/production/4035b7c0669dc20632825f49852ff9e403821fd3-1024x768.jpg"/><figure><img src="https://cdn.sanity.io/images/ze3fm6cq/production/4035b7c0669dc20632825f49852ff9e403821fd3-1024x768.jpg" alt=""/><figcaption>맛있었던 뒤풀이 자리</figcaption></figure><h2>후기</h2><p>현대모비스 알고리즘 대회가 처음 열릴 때만 해도 운영상의 문제로 욕을 좀 먹었는데, 이제는 대회 환경도 문제의 퀄리티도 많이 좋아진 것 같다. 그리고 무엇보다 이렇게 큰 규모의 상금을 주는 PS 대회도 드물고, 안 그래도 PS 대회나 기업 후원이 줄어가는 추세라 이런 대회가 꾸준히 열린다는 것만으로도 감사한 일이다. 그나마 학생이 아닌 일반인도 참가할 수 있었던 구글 코드잼마저 이제는 역사의 뒤안길로 사라져서 현대모비스 알고리즘 대회의 의미가 더욱 커진 것 같다.</p><p>개인적으로는 대회날의 경험도 아주 다이나믹했고 예상치 못하게 1등을 차지하게 되어서 기억에 남는 이벤트였다. 내가 이런 막대한 상금을 받는다는 건 상상도 못했던 일이었는데, 역대 대회 우승자 참가 금지와 일반부/학생부 구분 (매년 학생부가 더 치열하다), 평일 대회 진행 등의 요인이 겹쳐서 운 좋게 우승할 수 있었던 것이 아닐까 싶다. 물론 꾸준히 즐겁게 PS를 해왔던 경험도 큰 역할을 했을 것이다.</p><p>후기글을 끝내며, 24년 현대모비스 알고리즘 경진대회에 참가하는 모든 분들을 응원합니다!<br/></p>]]></content>
        <author>
            <name>queuedlab</name>
        </author>
    </entry>
</feed>