<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Nyan101 Blog</title><link>https://nyan101.github.io/blog/posts/</link><description>Recent content in Posts on Nyan101 Blog</description><generator>Hugo -- gohugo.io</generator><language>ko-KR</language><copyright>© nyan101</copyright><lastBuildDate>Sun, 08 Jun 2025 01:26:23 +0900</lastBuildDate><atom:link href="https://nyan101.github.io/blog/posts/feed.xml" rel="self" type="application/rss+xml"/><item><title>7년 근속(?) 후 이직 후기</title><link>https://nyan101.github.io/blog/job-transition-after-7-years/</link><pubDate>Sun, 08 Jun 2025 01:26:23 +0900</pubDate><guid>https://nyan101.github.io/blog/job-transition-after-7-years/</guid><description>&lt;p&gt;계속 &amp;ldquo;이직 후기 써야지&amp;hellip;&amp;rdquo; 라고 생각만 하고 미루다가 결국 이직 1주차가 지난 지금에서야 작성하는 후기(?)&lt;/p&gt;&#10;&lt;p&gt;사실 &lt;a href="https://nyan101.github.io/about/ko" target="_blank" rel="noreferrer"&gt;About&lt;/a&gt; 페이지나 그간의 대회 후기에서나 반쯤은 드러내놓고 써서 새삼스럽긴 하지만, 지난주, 정확히는 2025년 5월 31일을 기준으로 7년간의 군생활을 마치고 공군 대위에서 &lt;strong&gt;예비역&lt;/strong&gt; 공군 대위로 칭호가 바뀌었다. 전역하게 되면 뭔가 심정적으로도 크게 동요할 줄 알았는데 그새 1주일이 지나서인지 나름 익숙해진 것 같다. &lt;del&gt;올해부터 군 전직지원기간이 늘어서 지난 2월부터 출근 안 하고 거의 4개월 휴가를 보냈던 탓도 있는거같음&lt;/del&gt;&lt;/p&gt;</description></item><item><title>2024년도 대회 후기</title><link>https://nyan101.github.io/blog/contests-in-2024-review/</link><pubDate>Tue, 31 Dec 2024 11:58:42 +0900</pubDate><guid>https://nyan101.github.io/blog/contests-in-2024-review/</guid><description>&lt;p&gt;올해는 알고리즘 대회 하나(메타 해커컵), AI 대회 하나(국방 AI 경진대회)를 제외하면 다 보안 관련 대회들이라 밸런스가 안 맞다는 이유로, 이것저것 다양하게 해서 &lt;a href="https://nyan101.github.io/blog/CTF-contests-in-2023-review" target="_blank" rel="noreferrer"&gt;CTF 편&lt;/a&gt;, &lt;a href="https://nyan101.github.io/blog/PS-contests-in-2023-review" target="_blank" rel="noreferrer"&gt;PS/알고리즘 편&lt;/a&gt;, &lt;a href="https://nyan101.github.io/blog/others-in-2023-review" target="_blank" rel="noreferrer"&gt;기타 편&lt;/a&gt;을 따로 작성했던 2023년과는 달리 글 하나에 몰아 작성하기로 했다. &lt;del&gt;이제 나갈 수 있는 대회들이 점점 줄어간다&amp;hellip;&lt;/del&gt;&lt;/p&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;DEFCON CTF&#10; &lt;div id="defcon-ctf" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#defcon-ctf" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;&amp;ldquo;살면서 데프콘 본선도 와보고&amp;hellip;&amp;rdquo;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>2023년도 후기 - 기타(ETC) 편</title><link>https://nyan101.github.io/blog/others-in-2023-review/</link><pubDate>Sun, 31 Dec 2023 00:37:02 +0900</pubDate><guid>https://nyan101.github.io/blog/others-in-2023-review/</guid><description>&lt;p&gt;&lt;a href="https://nyan101.github.io/blog/CTF-contests-in-2023-review" target="_blank" rel="noreferrer"&gt;CTF 같은 해킹대회&lt;/a&gt;나 &lt;a href="https://nyan101.github.io/blog/PS-contests-in-2023-review" target="_blank" rel="noreferrer"&gt;PS 알고리즘 대회&lt;/a&gt;는 아니지만, 소소한 다른 것들을 정리할 포스트도 필요하다고 생각해 따로 작성했다. &lt;del&gt;막상 제대로 적을 건 둘밖에 없긴 하지만&lt;/del&gt;&lt;/p&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;정보보안기사 자격증 취득&#10; &lt;div id="정보보안기사-자격증-취득" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%ec%a0%95%eb%b3%b4%eb%b3%b4%ec%95%88%ea%b8%b0%ec%82%ac-%ec%9e%90%ea%b2%a9%ec%a6%9d-%ec%b7%a8%eb%93%9d" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;&amp;ldquo;3트만에 결국&amp;hellip;! 이제 쌍기사입니다&amp;rdquo;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>2023년도 대회 후기 - 알고리즘(PS) 편</title><link>https://nyan101.github.io/blog/PS-contests-in-2023-review/</link><pubDate>Sat, 30 Dec 2023 22:18:47 +0900</pubDate><guid>https://nyan101.github.io/blog/PS-contests-in-2023-review/</guid><description>&lt;p&gt;2023년 올해도 &lt;a href="https://nyan101.github.io/blog/CTF-contests-in-2023-review" target="_blank" rel="noreferrer"&gt;CTF 편&lt;/a&gt;에 이은 알고리즘(PS) 편이다. 올해는 &lt;del&gt;페이스북&lt;/del&gt; 메타 해커컵 티셔츠, SCPC 성불 모두 이룬 나름 의미있는 해였다.&lt;/p&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;구글 코드잼(Google Code Jam)&#10; &lt;div id="구글-코드잼google-code-jam" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%ea%b5%ac%ea%b8%80-%ec%bd%94%eb%93%9c%ec%9e%bcgoogle-code-jam" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;&amp;ldquo;이제는 역사의 흔적이 되어버린&amp;hellip;&amp;rdquo;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>2023년도 대회 후기 - 해킹(CTF) 편</title><link>https://nyan101.github.io/blog/CTF-contests-in-2023-review/</link><pubDate>Sat, 30 Dec 2023 20:19:31 +0900</pubDate><guid>https://nyan101.github.io/blog/CTF-contests-in-2023-review/</guid><description>&lt;p&gt;&lt;a href="https://nyan101.github.io/blog/CTF-contests-in-2022-review" target="_blank" rel="noreferrer"&gt;작년에 이어&lt;/a&gt; 올해도 대회는 꾸준히 나갔지만 후기는 연말에 몰아서 쓰게 됐다(&amp;hellip;)&lt;/p&gt;&#10;&lt;p&gt;올해는 작년과 달리 4인 CTF뿐만이 아니라, 사이버보안 해커톤, 온라인 국제대회 등 다양한 종류의 대회에 나가보았다.&lt;/p&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;CCE 사이버공격 방어대회&#10; &lt;div id="cce-사이버공격-방어대회" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#cce-%ec%82%ac%ec%9d%b4%eb%b2%84%ea%b3%b5%ea%b2%a9-%eb%b0%a9%ec%96%b4%eb%8c%80%ed%9a%8c" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;일시 : 6.10.(예선), 7.12.(본선)&lt;/li&gt;&#10;&lt;li&gt;주최/주관 : 국가정보원 / 국가보안기술연구소&lt;/li&gt;&#10;&lt;li&gt;결과 : &lt;strong&gt;공공기관 7위&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure style="width:90%;max-width:100%;margin-left:auto;margin-right:auto;"&gt;&lt;img&#10; class="mx-auto my-0 rounded-md"&#10; style="width:100%"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt=""&#10; src="https://nyan101.github.io/assets/images/2023/12/cce-main.jpg"&#10; &gt;&lt;/figure&gt;&#10;&lt;p&gt;국가정보원에서 주관하는 CTF로 일반인들을 위한 일반분야와 공공기관 종사자들을 위한 공공분야로 나눠 진행된다. 예선은 일반적인 Jeopardy(문제풀이) 방식, 본선은 Jeopardy와 함께 공격받는 Live 서버를 실시간으로 방어하는 방식으로 진행되었다. &lt;del&gt;작년이랑 설명이 똑같은 것 같다고요? 기분 탓입니다&lt;/del&gt;&lt;/p&gt;</description></item><item><title>구글, "코드잼 서비스를 종료합니다"</title><link>https://nyan101.github.io/blog/farewell-codejam/</link><pubDate>Tue, 06 Jun 2023 03:22:54 +0900</pubDate><guid>https://nyan101.github.io/blog/farewell-codejam/</guid><description>&lt;p&gt;매년 참가해오던 &lt;a href="https://codingcompetitions.withgoogle.com/codejam" target="_blank" rel="noreferrer"&gt;구글 코드잼&lt;/a&gt;이 올해를 끝으로 더 이상 운영되지 않는다는 공지를 내걸었다.&lt;/p&gt;&#10;&lt;figure style="width:90%;max-width:100%;margin-left:auto;margin-right:auto;"&gt;&lt;img&#10; class="mx-auto my-0 rounded-md"&#10; style="width:100%"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt=""&#10; src="https://nyan101.github.io/assets/images/2023/06/farewell-CodeJam.jpg"&#10; &gt;&lt;/figure&gt;&#10;&lt;p&gt;&lt;del&gt;전역까지 매년 티셔츠 모으려고 했는데ㅠ&lt;/del&gt; 들리는 소문에 따르면 구글 코드잼 운영부서가 통으로 구조조정당했다는 말이 있던데&amp;hellip; 코드잼과 함께 킥스타트, 해시코드 같은 다양한 대회들도 함께 종료되면서 매년 해오던 연례행사가 하나 사라진 기분이다. 되돌아보니 거의 5,6년간 해오던 대회였던 만큼 기록이 사라지기 전에 백업해두기로 했다.&lt;/p&gt;</description></item><item><title>2022년도 대회 후기 - 알고리즘(PS) 편</title><link>https://nyan101.github.io/blog/PS-contests-in-2022-review/</link><pubDate>Sat, 31 Dec 2022 21:41:12 +0900</pubDate><guid>https://nyan101.github.io/blog/PS-contests-in-2022-review/</guid><description>&lt;p&gt;&lt;a href="https://nyan101.github.io/blog/CTF-contests-in-2022-review" target="_blank" rel="noreferrer"&gt;2022년도 대회 후기 - 해킹(CTF) 편&lt;/a&gt;에 이은 알고리즘(PS) 편이다. &lt;del&gt;어떻게 2023년 오기 전에 다 쓰기는 하네&lt;/del&gt; 현대모비스 대회에서 예상치 못한 소득(feat. 500만원)과 함께 공군해커톤 등 나름 성과가 있었고, 올해도 SCPC 성불은 하지 못했다(&amp;hellip;)&lt;/p&gt;&#10;&lt;p&gt;예선/본선 일자가 명확했던 CTF와 달리 이번에는 기간을 두고 진행한 온라인 대회들이 많아 일시는 생략했다.&lt;/p&gt;</description></item><item><title>2022년도 대회 후기 - 해킹(CTF) 편</title><link>https://nyan101.github.io/blog/CTF-contests-in-2022-review/</link><pubDate>Sat, 31 Dec 2022 19:58:31 +0900</pubDate><guid>https://nyan101.github.io/blog/CTF-contests-in-2022-review/</guid><description>&lt;p&gt;2022년에는 대회 하나씩 끝날 때마다 후기를 쓰겠다고 다짐했지만 이번에도 결국 연말에 몰아서 쓰게 됐다(&amp;hellip;)&lt;/p&gt;&#10;&lt;p&gt;올해는 &lt;a href="https://nyan101.github.io/blog/CTF-contests-in-2021-review" target="_blank" rel="noreferrer"&gt;작년&lt;/a&gt;과는 달리 CTF에서도 나름의 성과가 있던 해였다. 아직 CVE를 찾거나 국방/공공분야라는 울타리를 벗어나지는 못했지만, 그래도 조금씩 경험이 쌓여가는 것 같아 나름 보람있게 보낸 느낌이다. &lt;del&gt;그런데 논문은 대체 언제 쓰지&amp;hellip;&lt;/del&gt;&lt;/p&gt;</description></item><item><title>2022 현대모비스 알고리즘 경진대회 후기</title><link>https://nyan101.github.io/blog/mobis-algorithm-contest-2022-review/</link><pubDate>Sun, 17 Jul 2022 13:52:12 +0900</pubDate><guid>https://nyan101.github.io/blog/mobis-algorithm-contest-2022-review/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR : 상금 500만원 감사합니다 &amp;gt;_&amp;lt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://nyan101.github.io/blog/PS-contests-in-2021-review" target="_blank" rel="noreferrer"&gt;작년&lt;/a&gt;에 이어 올해도 현대모비스에서 알고리즘 경진대회를 개최했다.&lt;/p&gt;&#10;&lt;figure style="width:75%;max-width:100%;margin-left:auto;margin-right:auto;"&gt;&lt;img&#10; class="mx-auto my-0 rounded-md"&#10; style="width:100%"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt=""&#10; src="https://nyan101.github.io/assets/images/2022/07/mobis-poster.jpg"&#10; &gt;&lt;/figure&gt;&#10;&lt;p&gt;이번에도 1등상품으로 &lt;strong&gt;최신형 자동차&lt;/strong&gt;를 내걸었다는 상징성으로 인해 온라인에서 화제가 됐다. 올해는 작년과는 다르게 학생부 / 일반부를 분리해 운영했는데, 직업적인 특성(&amp;hellip;)으로 인해 다소 애매한 포지션이었던 관계로 주최측 문의 후 안내에 따라 일반부로 지원했다.&lt;/p&gt;</description></item><item><title>[PyTorch] 06. wandb로 학습 진행상황 로깅하기</title><link>https://nyan101.github.io/blog/notes-on-pytorch-06/</link><pubDate>Sat, 12 Feb 2022 19:37:41 +0900</pubDate><guid>https://nyan101.github.io/blog/notes-on-pytorch-06/</guid><description>&lt;h2 class="relative group"&gt;학습 진행상황 기록하기&#10; &lt;div id="학습-진행상황-기록하기" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%ed%95%99%ec%8a%b5-%ec%a7%84%ed%96%89%ec%83%81%ed%99%a9-%ea%b8%b0%eb%a1%9d%ed%95%98%ea%b8%b0" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://nyan101.github.io/blog/notes-on-pytorch-04" target="_blank" rel="noreferrer"&gt;이전 글&lt;/a&gt;에서 작성한 코드는 &lt;code&gt;tqdm&lt;/code&gt; 라이브러리를 통해 &amp;ldquo;학습이 얼마나 진행되었는가&amp;quot;를 실시간으로 출력했다. 이를 통해 실행이 끝나기까지 막연히 기다리기만 하는 일반적인 코드와는 달리, 각 epoch당 남은 예상시간과 epoch별 train/val loss, accuracy를 출력해 학습이 진행됨에 따라 정확도가 높아지는 모습을 로그로 남길 수 있었다.&lt;/p&gt;</description></item><item><title>[PyTorch] 05. data.Dataset으로 나만의 Dataset 클래스 만들기</title><link>https://nyan101.github.io/blog/notes-on-pytorch-05/</link><pubDate>Wed, 09 Feb 2022 18:53:27 +0900</pubDate><guid>https://nyan101.github.io/blog/notes-on-pytorch-05/</guid><description>&lt;h2 class="relative group"&gt;자체 Dataset 클래스의 필요성&#10; &lt;div id="자체-dataset-클래스의-필요성" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%ec%9e%90%ec%b2%b4-dataset-%ed%81%b4%eb%9e%98%ec%8a%a4%ec%9d%98-%ed%95%84%ec%9a%94%ec%84%b1" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;지금까지의 실습에서는 &lt;code&gt;torchvision.datasets&lt;/code&gt;에서 제공하는 데이터셋을 사용했다. &lt;code&gt;torchvision&lt;/code&gt; 라이브러리는 vision과 관련된 약 30여개의 데이터셋을 제공하며, 전체 목록은 &lt;a href="https://pytorch.org/vision/stable/datasets.html" target="_blank" rel="noreferrer"&gt;공식 홈페이지&lt;/a&gt;에서 확인할 수 있다.&lt;/p&gt;&#10;&lt;p&gt;그러나 실습이나 연구를 진행하다 보면, 기존에 잘 알려진 데이터셋 외에 자신만의 데이터로 학습을 진행해야 하는 상황이 자주 발생한다. 이를 위해 &lt;code&gt;torch.utils.data.dataloader&lt;/code&gt;에 넘길 수 있는 나만의 &lt;code&gt;Dataset&lt;/code&gt; 객체를 만드는 법을 알아보자.&lt;/p&gt;</description></item><item><title>[PyTorch] 04. validation phase를 추가해 train_model() 함수 작성하기</title><link>https://nyan101.github.io/blog/notes-on-pytorch-04/</link><pubDate>Mon, 07 Feb 2022 20:38:11 +0900</pubDate><guid>https://nyan101.github.io/blog/notes-on-pytorch-04/</guid><description>&lt;p&gt;굉장히 오랜만에 이어지는 포스팅이다&amp;hellip; &lt;del&gt;핑거스냅에 당해서 블립(blip) 당함&lt;/del&gt;&lt;/p&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;모델 학습에서의 Training &amp;amp; Validation&#10; &lt;div id="모델-학습에서의-training--validation" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%eb%aa%a8%eb%8d%b8-%ed%95%99%ec%8a%b5%ec%97%90%ec%84%9c%ec%9d%98-training--validation" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://nyan101.github.io/blog/notes-on-pytorch-03" target="_blank" rel="noreferrer"&gt;이전 글&lt;/a&gt;에서 작성했던 마지막 코드를 다시 살펴보자. 이전 글에서는 아래 5가지 단계를 거쳤다.&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;nn.Module&lt;/code&gt;을 상속받은 모델 클래스 작성&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;torchvision.datasets&lt;/code&gt; 라이브러리에서 유명 데이터셋(MNIST) 다운로드&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;torch.utils.data.Dataloader&lt;/code&gt; 사용법&lt;/li&gt;&#10;&lt;li&gt;모델의 1 epoch 학습 진행&lt;/li&gt;&#10;&lt;li&gt;모델의 test 성능 측정&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;각 단계별로 주요 로직을 정리해 하나의 코드로 합친 결과는 다음과 같다.&lt;/p&gt;</description></item><item><title>새 맥북프로 생긴 후기(feat. Softeer)</title><link>https://nyan101.github.io/blog/macbook-pro-review/</link><pubDate>Thu, 20 Jan 2022 19:05:22 +0900</pubDate><guid>https://nyan101.github.io/blog/macbook-pro-review/</guid><description>&lt;p&gt;예전 소멤(Samsung Software Membership)에서 받은 삼성 노트북9를 쓴 지도 벌써 만 4년이 지났다. 요새는 노트북에 키보스, 마우스, 모니터까지 따로 연결해 거의 노트북을 데탑처럼 쓰고 있다보니, 이참에 데스크탑 PC를 하나 구입할까 고민하던 중 &lt;a href="https://softeer.ai/" target="_blank" rel="noreferrer"&gt;소프티어(Softeer)&lt;/a&gt;에서 모의대회를 연다는 소식을 접했다.&lt;/p&gt;&#10;&lt;figure style="width:90%;max-width:100%;margin-left:auto;margin-right:auto;"&gt;&lt;img&#10; class="mx-auto my-0 rounded-md"&#10; style="width:100%"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt=""&#10; src="https://nyan101.github.io/assets/images/2022/01/softeer-contest-title.jpg"&#10; &gt;&lt;/figure&gt;&#10;&lt;p&gt;1등 상품이 맥북 프로인 걸 보고 &amp;ldquo;혹시&amp;hellip;?&amp;rdquo; 하는 마음에 &lt;del&gt;주변에 소문내지 않고&lt;/del&gt; 조용히 참가를 신청했다. 대회는 일반적인 ICPC 방식(패널티 합산)으로 이루어졌고, 이런 대회의 특성상 푼 문제 수만큼이나 빠르게 푸는 게 승부를 가를 것 같았다.&lt;/p&gt;</description></item><item><title>2021년도 대회 후기 - 알고리즘(PS) 편</title><link>https://nyan101.github.io/blog/PS-contests-in-2021-review/</link><pubDate>Mon, 01 Nov 2021 12:56:49 +0900</pubDate><guid>https://nyan101.github.io/blog/PS-contests-in-2021-review/</guid><description>&lt;p&gt;지난번 &lt;a href="https://nyan101.github.io/blog/CTF-contests-in-2021-review" target="_blank" rel="noreferrer"&gt;2021년도 대회 후기 - 해킹(CTF) 편&lt;/a&gt;에 이은 알고리즘(PS) 편이다. 올해는 전반적으로 성적이 좋지는 못한데, 개인적으로 기대했던 SCPC에서 억울할 정도의(&amp;hellip;) 성적을 받아 여러모로 후유증이 남기도 했다. &lt;del&gt;Z플립 3 지를때 &amp;ldquo;SCPC에서 보충해야지&amp;quot;라고 계획까지 세워놨는데&amp;hellip;&lt;/del&gt;&lt;/p&gt;</description></item><item><title>2021년도 대회 후기 - 해킹(CTF) 편</title><link>https://nyan101.github.io/blog/CTF-contests-in-2021-review/</link><pubDate>Sat, 30 Oct 2021 18:40:29 +0900</pubDate><guid>https://nyan101.github.io/blog/CTF-contests-in-2021-review/</guid><description>&lt;p&gt;원래 대회 하나 끝낼 때마다 후기를 쓰려고 했는데 딱히 쓸만한 성과가 나오지 않았기도 했고, 한동안 바빴다보니 이번에 몰아서 쓰게 됐다. 모든 대회를 다 쓸까 하다가 그나마 성격 비슷한 것들끼리 모아서 2편으로 나눴다. 학부 때는 주로 알고리즘 대회 위주로 나갔다보니 CTF를 제대로 나가본 적은 올해가 처음이지만 그걸 감안해도 아쉬움이 많이 남는 경험이었다.&lt;/p&gt;</description></item><item><title>Code Jam Kickstart 2021 Round E 후기</title><link>https://nyan101.github.io/blog/CodeJam-Kickstart-2021-RoundE-review/</link><pubDate>Tue, 14 Sep 2021 20:51:38 +0900</pubDate><guid>https://nyan101.github.io/blog/CodeJam-Kickstart-2021-RoundE-review/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR : 전세계 단위에서 한 자리 등수(8등) 찍어봄&lt;/strong&gt;&lt;/p&gt;&#10;&lt;figure style="width:90%;max-width:100%;margin-left:auto;margin-right:auto;"&gt;&lt;img&#10; class="mx-auto my-0 rounded-md"&#10; style="width:100%"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt=""&#10; src="https://nyan101.github.io/assets/images/2021/09/kickstart-E.jpg"&#10; &gt;&lt;/figure&gt;&#10;&lt;p&gt;그동안 킥스타트는 굳이 후기를 안 썼지만 이번에 역대급 성과를 낸 김에 글로 남겨본다.&lt;/p&gt;&#10;&lt;p&gt;예전에도 10~20등 사이의 성적을 낸 적은 있었지만 사이트가 리뉴얼된 후 참가자가 급증하면서&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; 한동안 100등 바깥으로 밀려났었다. 재작년 코포 접은 이후로 PS 문제풀이를 자주 하진 않더라도 실력체크 겸 코드잼/해커컵/킥스타트 정도는 계속 해보자는 생각에 꾸준히 참가했고, 이번 킥스타트에서는 마침 상성이 잘 맞는(?) 문제들을 만나 8등이라는 좋은 성적을 거둘 수 있었다.&lt;/p&gt;</description></item><item><title>공군 사이버전사 경연대회 후기</title><link>https://nyan101.github.io/blog/airforce-cyberwarrior-contest-2021-review/</link><pubDate>Sun, 15 Aug 2021 23:57:12 +0900</pubDate><guid>https://nyan101.github.io/blog/airforce-cyberwarrior-contest-2021-review/</guid><description>&lt;p&gt;&lt;del&gt;8월의 반이 지나서야 쓰는 2021년도 첫글.&lt;/del&gt; 올해도 코드잼은 했고(티셔츠 배송은 아직 안 옴), 다음달이면 SCPC 본선도 있긴 하지만 올해 글이 너무 없는거같아서 일단 하나 써보기로 했다.&lt;/p&gt;&#10;&lt;p&gt;어차피 군대에서 여는 대회다보니 뭘 얼마나 공개 가능한지 몰라서 문제에 대한 세부 내용이나 그런건 어차피 안 나온다. 그냥 군에서 이런 대회를 했고, 부대 인원들의 배려로 좋은 경험을 했다는걸 기록으로 남기고 싶어서 쓰는 의미없는 글이다.&lt;/p&gt;</description></item><item><title>2020년도 대회 후기</title><link>https://nyan101.github.io/blog/programming-contests-in-2020-review/</link><pubDate>Wed, 18 Nov 2020 20:09:32 +0900</pubDate><guid>https://nyan101.github.io/blog/programming-contests-in-2020-review/</guid><description>&lt;p&gt;지난 코드잼, 해커컵 이후로도 출전한 대회는 몇 있었지만 문제 유출 방지규정이나 다른 사정(&lt;del&gt;대회 종료 직후의 귀찮음이라던가&lt;/del&gt;), 혹은 딱히 별도의 글로 쓸만한 성과가 아니었다는 이유로 따로 후기를 쓰진 않았다. 그러다보니 시간이 꽤 지나 굳이 각각을 별도의 글로 쪼개기도 애매해졌고, 대회 후기글로 블로그를 도배할 생각도 없어 이번 기회에 한번 몰아서 정리해봤다.&lt;/p&gt;</description></item><item><title>Facebook Hacker Cup 2020 후기</title><link>https://nyan101.github.io/blog/facebook-hackercup-2020-review/</link><pubDate>Sun, 30 Aug 2020 20:35:19 +0900</pubDate><guid>https://nyan101.github.io/blog/facebook-hackercup-2020-review/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR : 이번엔 티셔츠 받음&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://nyan101.github.io/blog/facebook-hackercup-2019-review" target="_blank" rel="noreferrer"&gt;2019년 해커컵&lt;/a&gt;에 이어 올해도 2020년도 페이스북 해커컵 대회가 열렸다. 이번에도 Round 2에서 늦잠을 자면서 Round 3은 달성하지 못했지만&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; 티셔츠까지는 받을 수 있었다. 구글 코드잼은 작년에 티셔츠를 받았지만 해커컵은 이번이 첫 티셔츠여서 그런지 나름 만족스럽다.&lt;/p&gt;&#10;&lt;p&gt;그동안 해커컵에서의 제일 큰 불만은 &lt;strong&gt;small / large가 없어서 조금이라도 실수하면 돌이킬 수가 없다&lt;/strong&gt;라는 점이었는데, 이번에는 validate step이 나와서 이런 점이 조금은 완화됐다. 코드포스의 pretest 느낌으로 &lt;code&gt;validate_input.txt&lt;/code&gt;을 제공하고, &lt;code&gt;validate_output.txt&lt;/code&gt;를 제출하면 이에 대한 채점결과를 알려주는 시스템이 추가되면서 &amp;ldquo;그래도 바보같은 코딩실수는 안했구나&amp;quot;라는 확인을 할 수 있었다.&lt;/p&gt;</description></item><item><title>Google Code Jam 2020 후기</title><link>https://nyan101.github.io/blog/Google-CodeJam-2020-review/</link><pubDate>Thu, 11 Jun 2020 00:09:32 +0900</pubDate><guid>https://nyan101.github.io/blog/Google-CodeJam-2020-review/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR : 올해도 티셔츠 받음&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;지난주 토요일 2020년 &lt;a href="https://codingcompetitions.withgoogle.com/codejam" target="_blank" rel="noreferrer"&gt;코드잼&lt;/a&gt;을 마쳤다. 사실 대회에 대한 설명이나 기본적인 소개는 작년에 &lt;a href="https://nyan101.github.io/blog/Google-CodeJam-2019-review" target="_blank" rel="noreferrer"&gt;거의 똑같은 글&lt;/a&gt;을 썼어서 이번엔 별로 할 말이 많지는 않다.&lt;/p&gt;&#10;&lt;figure style="width:90%;max-width:100%;margin-left:auto;margin-right:auto;"&gt;&lt;img&#10; class="mx-auto my-0 rounded-md"&#10; style="width:100%"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt=""&#10; src="https://nyan101.github.io/assets/images/2020/06/GCJ-result.png"&#10; &gt;&lt;/figure&gt;&#10;&lt;p&gt;작년에 이어 이번에도 티셔츠를 받을 수 있는 Round 3까지 진출에 성공했다. 작년 티셔츠는 L사이즈로 신청했는데, 한국이랑 미국 옷의 기준이 다른건지 티셔츠 끝이 거의 허벅지까지 내려와 밖에서 입고 다니지는 못했다.&lt;/p&gt;</description></item><item><title>소인수분해 알고리즘(Pollard-(p-1), Pollard-rho, Dixon's Random Square)</title><link>https://nyan101.github.io/blog/algorithms-for-integer-factorization/</link><pubDate>Wed, 27 May 2020 01:25:33 +0900</pubDate><guid>https://nyan101.github.io/blog/algorithms-for-integer-factorization/</guid><description>&lt;p&gt;&lt;a href="https://nyan101.github.io/blog/algorithms-for-discrete-logarithm-problem" target="_blank" rel="noreferrer"&gt;지난번 글&lt;/a&gt;에서는 이산 로그 문제에 대해 다뤘으니 이번에는 소인수분해 문제를 해결하는 알고리즘에 대해 알아보자. 코드는 이전과 마찬가지로 아래와 같은 수정이 들어간 파이썬 문법을 따랐다.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;양 끝을 명시적으로 나타내기 위해 &lt;code&gt;range(st, ed+1)&lt;/code&gt; 대신 &lt;code&gt;[st...ed]&lt;/code&gt;와 같은 표기를 사용했다.&lt;/li&gt;&#10;&lt;li&gt;파이썬에서 거듭제곱을 나타내는 &lt;code&gt;a**b&lt;/code&gt; 대신 일반적으로 사용되는 &lt;code&gt;a^b&lt;/code&gt; 표기를 사용했다.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;지난 이산 로그 문제와는 달리 &lt;del&gt;모두가 알 것이라 믿고&lt;/del&gt; 소인수분해 문제에 대한 자세한 설명은 생략한다. 또한 알고리즘 설계를 간단히 하기 위해 소인수분해 문제의 요구조건을 &lt;strong&gt;주어진 자연수 n에 대해, 1과 자기 자신(=n)을 제외한 약수를 발견하는 것&lt;/strong&gt;으로 정했다.&lt;/p&gt;</description></item><item><title>리디북스 페이퍼 프로(Ridi Paper Pro) 사용기</title><link>https://nyan101.github.io/blog/ridibooks-paper-pro-review/</link><pubDate>Mon, 18 May 2020 21:49:40 +0900</pubDate><guid>https://nyan101.github.io/blog/ridibooks-paper-pro-review/</guid><description>&lt;p&gt;직장 도서관에서 책을 빌릴 수 있긴 하지만 책을 신청하면 빨라도 1주일 후에 구매되는 일이 많고, 약속시간이 애매하게 남거나 굳이 책을 넣어갈 가방이 없는 경우(ex: 노트북 파우치) 종이책을 들고다니기엔 부담스러웠던 적이 종종 있었다. 그러던 중 지난 4월 초 직장에서 상여금이 나왔고(!) 주변 지인들로부터 전자책에 대한 긍정적인 평을 많이 들었던 터라 전자책 리더기를 하나 장만했다.&lt;/p&gt;</description></item><item><title>이산 로그 문제(DLP)에 대한 알고리즘(Shanks, Pollard-rho, Pohlig-Hellman)</title><link>https://nyan101.github.io/blog/algorithms-for-discrete-logarithm-problem/</link><pubDate>Fri, 08 May 2020 16:36:14 +0900</pubDate><guid>https://nyan101.github.io/blog/algorithms-for-discrete-logarithm-problem/</guid><description>&lt;p&gt;암호학, 특히 공개키 기반 암호시스템은 주로 1)소인수분해 문제 혹은 2)이산 로그 문제를 기반으로 설계되는 경우가 많다. 그중 이산 로그 문제와 이를 해결하는 알고리즘에 대해 알아보자. 예시로 든 코드는 기본적으로 파이썬 문법을 따라 작성했으며 가독성을 위해 다음과 같은 부분을 수정했다.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;파이썬에서 &lt;code&gt;range(n)&lt;/code&gt;은 0부터 시작해 n이 아닌 n-1까지를 포함한다. 양 끝을 명시적으로 나타내기 위해 &lt;code&gt;[st...ed]&lt;/code&gt;와 같은 표기를 사용했다.&lt;/li&gt;&#10;&lt;li&gt;파이썬에서 거듭제곱을 나타내는 &lt;code&gt;a**b&lt;/code&gt; 대신 일반적으로 사용되는 &lt;code&gt;a^b&lt;/code&gt; 표기를 사용했다.&lt;/li&gt;&#10;&lt;li&gt;mod p에서의 역원을 &lt;code&gt;a^(-1)&lt;/code&gt;로 표기했다. 실제 구현에서는 다음과 같이 구할 수 있다.&#10;&lt;ul&gt;&#10;&lt;li&gt;페르마 소정리에 의해 $a^{p-1} \equiv 1 \pmod p$이므로 $a\cdot a^{p-2} \equiv 1$에서 $a^{-1} \equiv a^{p-2}$&lt;/li&gt;&#10;&lt;li&gt;$p$가 소수가 아닌 경우, 확장 유클리드 알고리즘을 사용한다&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;이산 로그 문제&#10; &lt;div id="이산-로그-문제" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%ec%9d%b4%ec%82%b0-%eb%a1%9c%ea%b7%b8-%eb%ac%b8%ec%a0%9c" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;이산 로그 문제는 이산 대수 문제라고도 하며, 순환군 $\langle g \rangle$와 군의 원시근(primitive root) $g$, 그리고 $y \in \langle g \rangle$ 가 주어졌을 때, $y=g^k$를 만족하는 최소의 자연수 $k$를 찾는 문제이다. 암호학에서는 큰 소수 $p$에 대해 $p$로 나눈 나머지들의 모임인 $\mathbb{Z}_p^\ast$를 사용하는 경우가 많다.&lt;/p&gt;</description></item><item><title>[ML] Knockoff Net: 랜덤한 입력으로 다른 모델을 모방할 수 있을까?</title><link>https://nyan101.github.io/blog/knockoff-net-with-complete-noise/</link><pubDate>Sun, 03 Nov 2019 11:12:33 +0900</pubDate><guid>https://nyan101.github.io/blog/knockoff-net-with-complete-noise/</guid><description>&lt;h2 class="relative group"&gt;발상: Knockoff Nets&#10; &lt;div id="발상-knockoff-nets" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%eb%b0%9c%ec%83%81-knockoff-nets" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;어제(2일) 대학원에서 Mario Fritz 박사님의 AI Security에 대한 강연을 들어볼 수 있었다. 딥러닝이 대세가 되면서 등장한 여러 보안 문제들에 대한 특강이었는데, 그중 Model Stealing(구체적으로는 Functionality Stealing)에 대해 다룬 &lt;a href="https://arxiv.org/abs/1812.02766" target="_blank" rel="noreferrer"&gt;knockoff-net&lt;/a&gt; 관련 내용이 흥미로워 pytorch로 구현해보았다. 다만 노트북이라는 한계로 원본 논문보다는 디테일을 다소 단순화했다(&amp;hellip;)&lt;/p&gt;</description></item><item><title>[PyTorch] 03. torch.nn 모듈 조립으로 CNN 만들기</title><link>https://nyan101.github.io/blog/notes-on-pytorch-03/</link><pubDate>Sun, 25 Aug 2019 16:39:46 +0900</pubDate><guid>https://nyan101.github.io/blog/notes-on-pytorch-03/</guid><description>&lt;h2 class="relative group"&gt;예제 dataset 가져오기&#10; &lt;div id="예제-dataset-가져오기" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%ec%98%88%ec%a0%9c-dataset-%ea%b0%80%ec%a0%b8%ec%98%a4%ea%b8%b0" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;지금까지는 \(y=ax+b\)나 \(y=ax^2+bx+c\) 처럼 간단한 형태의 숫자→숫자 함수만을 모델링했으니 이제 좀더 흥미로운 데이터를 살펴보자.&lt;/p&gt;&#10;&lt;p&gt;딥러닝, 특히 이미지 인식 관련 예제를 보면 MNIST나 CIFAR-10같은 이름이 많이 등장한다. 이 둘은 Image Classification 문제의 대표적인 예시로 각각 손글씨와 물체 사진 이미지셋에 해당하며, 흔히 모델의 벤치마크 용도로 활용되고 있다. 이번 글에서는 좀더 단순한 MNIST를 사용하기로 한다. MNIST 데이터는 아래와 같이 색이 없는 1채널(=gray scale) 28x28픽셀 이미지들의 모음으로 0에서 9까지 총 10개의 라벨을 가지고 있다.&lt;/p&gt;</description></item><item><title>[PyTorch] 02. nn.Module로 모델 클래스 만들기</title><link>https://nyan101.github.io/blog/notes-on-pytorch-02/</link><pubDate>Tue, 20 Aug 2019 21:53:17 +0900</pubDate><guid>https://nyan101.github.io/blog/notes-on-pytorch-02/</guid><description>&lt;h2 class="relative group"&gt;학습의 각 단계를 추상화하기&#10; &lt;div id="학습의-각-단계를-추상화하기" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%ed%95%99%ec%8a%b5%ec%9d%98-%ea%b0%81-%eb%8b%a8%ea%b3%84%eb%a5%bc-%ec%b6%94%ec%83%81%ed%99%94%ed%95%98%ea%b8%b0" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;앞서 그래디언트를 이용해 간단한 학습이 이루어지는 과정을 알아보았다. 이전 글의 마지막 코드를 다시 살펴보면 학습의 한 round를 크게 다음과 같은 단계들로 추상화시킬 수 있다.&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_adjust&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 1) 파라미터를 이용해 입력(xs)으로부터 예상 결과를 생성&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;y_pred&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 2) 예상 결과(y_pred)와 실제 결과(ys)를 비교해 오차를 계산&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;y_pred&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 3) .backward()를 통해 각 파라미터가 오차에 관여하는 정도를 역산&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backward&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 4) 역산된 grad를 바탕으로 파라미터 수정 &lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 5) 파라미터들의 grad값을 0으로 초기화&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grad&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zero_&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grad&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zero_&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;그런데 이번과 같이 모델이 \(y=ax+b\) 처럼 간단한 형태인 경우 파라미터(&lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;)들을 각자 관리할 수 있지만, 복잡한 모델의 경우 이는 상당히 번거로운 과정이 될 수 있다. 흩어진 파라미터들을 통합해 관리한다면 어떤 형태가 가능할지 생각해 보자.&lt;/p&gt;</description></item><item><title>[PyTorch] 01. PyTorch의 기본 구조</title><link>https://nyan101.github.io/blog/notes-on-pytorch-01/</link><pubDate>Sun, 18 Aug 2019 22:00:21 +0900</pubDate><guid>https://nyan101.github.io/blog/notes-on-pytorch-01/</guid><description>&lt;p&gt;요새는 뭘 찾아봐도 딥러닝이 나온다..&lt;/p&gt;&#10;&lt;p&gt;성향이 continuous, gradient 같은 거랑은 안 맞아서 최대한 피해보려고 했지만 &lt;del&gt;결국 시대의 흐름에 거스르지 못하고&lt;/del&gt; 어떻게 사용하는지 정도는 알아두는게 좋을 것 같아서 정리해봤다.&lt;/p&gt;&#10;&#10;&#10;&lt;h4 class="relative group"&gt;요구사항(prerequisite)&#10; &lt;div id="요구사항prerequisite" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%ec%9a%94%ea%b5%ac%ec%82%ac%ed%95%adprerequisite" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;python에 대한 기초지식 &lt;br&gt;&#10;(ex: &lt;code&gt;ABC.xyz()&lt;/code&gt;는 클래스/객체 &lt;code&gt;ABC&lt;/code&gt; 안에 있는 &lt;code&gt;xyz&lt;/code&gt; 라는 함수를 호출하는 것이다)&lt;/li&gt;&#10;&lt;li&gt;함수에 대한 개념(규칙에 따라 input → output으로 이어지는 블랙박스로 이해해도 된다)&lt;/li&gt;&#10;&lt;li&gt;머릿속 이미지화를 위한 약간의 상상력(?)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;tensor 클래스&#10; &lt;div id="tensor-클래스" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#tensor-%ed%81%b4%eb%9e%98%ec%8a%a4" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;tensor는 \(n\_1 \times n\_2 \times \cdots \times n\_d \) 개의 숫자를 \(d\)차원으로 정렬한 객체이다. 편의상 예시는 2차원 이하만을 다룰 예정이지만 임의의 차원을 가질 수 있다는 점은 알아두자.&lt;/p&gt;</description></item><item><title>Facebook Hacker Cup 2019 후기</title><link>https://nyan101.github.io/blog/facebook-hackercup-2019-review/</link><pubDate>Sun, 14 Jul 2019 16:09:22 +0900</pubDate><guid>https://nyan101.github.io/blog/facebook-hackercup-2019-review/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR : 아무래도 페이스북 티셔츠와는 연이 없는 모양이다(&amp;hellip;)&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://nyan101.github.io/blog/facebook-hackercup-2018-review" target="_blank" rel="noreferrer"&gt;2018년 해커컵&lt;/a&gt;에 이어 2019년도 페이스북 해커컵 대회가 열렸다. 이번에는 지난번같은 실수 없이 티셔츠, 운이 좋다면 Round 3까지 진출하는 걸 목표로 삼았지만 결국 달성하지 못했다. 일요일 새벽 2시에 열리는 Round 2를 위해 토요일 저녁에 미리 잠들고, 알람까지 맞춰놨지만 눈을 뜨니 2시 23분이었고 급하게 노트북을 켰지만 이미 대회 시작에서 30분이 지난 상황이었다.&lt;/p&gt;</description></item><item><title>Google Code Jam 2019 후기</title><link>https://nyan101.github.io/blog/Google-CodeJam-2019-review/</link><pubDate>Tue, 11 Jun 2019 20:55:07 +0900</pubDate><guid>https://nyan101.github.io/blog/Google-CodeJam-2019-review/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR : 코드잼 티셔츠 받음&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;2019년 &lt;a href="https://codingcompetitions.withgoogle.com/codejam" target="_blank" rel="noreferrer"&gt;코드잼 본 대회&lt;/a&gt;를 치렀다. 몇 번 글을 썼던 Kickstart와는 달리 1년에 1번밖에 열리지 않는 대회이고, 작년엔 훈련소에 있느라 참가를 못 해서인지 조금은 긴장된 마음이었다. 대학 시절 내내 코드잼, 해커컵을 통틀어 티셔츠와는 인연이 없었기에 이번에야말로 하나 받아내겠다는 생각을 했다.&lt;/p&gt;&#10;&lt;figure style="width:90%;max-width:100%;margin-left:auto;margin-right:auto;"&gt;&lt;img&#10; class="mx-auto my-0 rounded-md"&#10; style="width:100%"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt=""&#10; src="https://nyan101.github.io/assets/images/2019/06/GCJ-main.png"&#10; &gt;&lt;/figure&gt;&#10;&lt;p&gt;구글 코드잼(Google Code Jam)은 이름에서처럼 구글에서 주최하는 코딩대회로 Qualification Round와 온사이트 World Final을 포함해 총 5단계로 이루어진다. World Final은 전 세계를 통틀어 상위 25명밖에 나갈 수 없어 기대조차 안했고(&amp;hellip;) 그 이전 단계인 Round 3(세계 상위 1000명)까지를 목표로 삼았다.&lt;/p&gt;</description></item><item><title>FireEye Cyber Defense Live 2019 Seoul 후기</title><link>https://nyan101.github.io/blog/FireEye-Cyber-Defense-Live-2019-Seoul-review/</link><pubDate>Sun, 28 Apr 2019 15:43:33 +0900</pubDate><guid>https://nyan101.github.io/blog/FireEye-Cyber-Defense-Live-2019-Seoul-review/</guid><description>&lt;p&gt;지난 25일 목요일, 삼성역 인근 서울 파르나스 호텔에서 FireEye Cyber Defense Live 2019 Seoul 컨퍼런스가 열렸다. Cyber Defense Live는 미국의 보안회사 FireEye에서 주최하는 컨퍼런스로 국제 사이버 보안의 최근 동향과 공격/방어에서의 새로운 인사이트 제시, 기업 차원에서의 PR 등 다양한 주제가 포함되어 있었다. &lt;del&gt;사실 이런 컨퍼런스가 있는 줄도 몰랐는데 직장에서 출장으로 보내줌&lt;/del&gt;&lt;/p&gt;</description></item><item><title>Code Jam Kickstart 2019 Round B 후기</title><link>https://nyan101.github.io/blog/CodeJam-Kickstart-2019-RoundB-review/</link><pubDate>Sun, 21 Apr 2019 15:42:21 +0900</pubDate><guid>https://nyan101.github.io/blog/CodeJam-Kickstart-2019-RoundB-review/</guid><description>&lt;p&gt;지난 Round A에 이어 리뉴얼된 킥스타트에서 치르는 두번째 대회였다. 다행히 지난번과 같은 서버 문제는 없었지만 생각처럼 문제가 잘 풀리지는 않았다. A번을 제출하고 나니 딱히 풀이가 떠오르는 문제가 없어 결국 B, C 모두 Small까지만 통과할 수 있었다. 결과는 최종 115등으로 전체 문제는 &lt;a href="https://codingcompetitions.withgoogle.com/kickstart/round/0000000000050eda" target="_blank" rel="noreferrer"&gt;여기&lt;/a&gt;에서 볼 수 있다.&lt;/p&gt;&#10;&lt;figure style="width:90%;max-width:100%;margin-left:auto;margin-right:auto;"&gt;&lt;img&#10; class="mx-auto my-0 rounded-md"&#10; style="width:100%"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt=""&#10; src="https://nyan101.github.io/assets/images/2019/04/kickstart-B-dashboard.png"&#10; &gt;&lt;/figure&gt;&#10;&#10;&#10;&lt;h4 class="relative group"&gt;Problem A. Building Palindromes&#10; &lt;div id="problem-a-building-palindromes" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#problem-a-building-palindromes" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h4&gt;&#10;&lt;p&gt;문자열이 주어지면 주어진 문자열의 l&amp;hellip;r 구간에 포함된 글자들로 팰린드롬을 만들 수 있는지 판단해야 한다. 구간 [l, r]에 속한 글자들만으로 팰린드롬을 만들기 위해서는 홀수 번 등장하는 알파벳이 최대 하나여야 한다는 사실에 유의하면, 각 알파벳 등장 횟수의 prefix sum을 이용해 각 쿼리를 \(O(26)\)에 처리할 수 있다. 첫 제출에서 초기화에 쓴 &lt;code&gt;fill&lt;/code&gt; 함수의 범위를 잘못 잡았다는 걸 깨달아 대회 도중 다시 제출했다. [[source](https://github.com/nyan101/algorithm_snippet/blob/master/CodeJam/Kickstart 2019 Round B/A.cpp)]&lt;/p&gt;</description></item><item><title>코딩에서 답지를 보는것에 대한 개인적인 생각</title><link>https://nyan101.github.io/blog/thoughts-on-model-answers-in-coding/</link><pubDate>Fri, 19 Apr 2019 12:34:51 +0900</pubDate><guid>https://nyan101.github.io/blog/thoughts-on-model-answers-in-coding/</guid><description>&lt;p&gt;* 개인 페이스북 타임라인에 썼던 내용을 다듬어 업로드한 글입니다.&lt;/p&gt;&#10;&#10;&#10;&lt;h3 class="relative group"&gt;알고리즘(PS)을 공부하는 법&#10; &lt;div id="알고리즘ps을-공부하는-법" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%ec%95%8c%ea%b3%a0%eb%a6%ac%ec%a6%98ps%ec%9d%84-%ea%b3%b5%eb%b6%80%ed%95%98%eb%8a%94-%eb%b2%95" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h3&gt;&#10;&lt;p&gt;인터넷을 보면 종종 &amp;ldquo;알고리즘 잘 하는 법(or알고리즘 문제 잘 푸는 법)&amp;ldquo;에 대한 질문글이 올라오고, 많은 경우 &amp;ldquo;모르겠다고 답지를 보지 말고 혼자서 끝까지 고민해봐야 한다&amp;quot;라는 답변이 주를 이룬다.&lt;/p&gt;</description></item><item><title>Möbius 함수의 정의와 활용</title><link>https://nyan101.github.io/blog/Mobius-function/</link><pubDate>Sun, 31 Mar 2019 21:38:49 +0900</pubDate><guid>https://nyan101.github.io/blog/Mobius-function/</guid><description>&lt;p&gt;얼마 전 코드포스에서 &lt;a href="http://codeforces.com/contest/1139/problem/D" target="_blank" rel="noreferrer"&gt;흥미로운 문제&lt;/a&gt;를 접했다. 대회 당시에는 풀지 못했는데, 에디토리얼을 읽어보던 중 뫼비우스 함수(Möbius function)에 대한 언급이 있어 이에 대해 좀더 자세히 알아보았다.&lt;/p&gt;&#10;&#10;&#10;&lt;h3 class="relative group"&gt;Möbius function의 정의&#10; &lt;div id="möbius-function의-정의" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#m%c3%b6bius-function%ec%9d%98-%ec%a0%95%ec%9d%98" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h3&gt;&#10;&lt;p&gt;뫼비우스 함수(Möbius function)는 자연수 n에 대해 다음과 같이 정의된다. (\(p\)는 소수)&lt;/p&gt;</description></item><item><title>Code Jam Kickstart 2019 Round A 후기</title><link>https://nyan101.github.io/blog/CodeJam-Kickstart-2019-RoundA-review/</link><pubDate>Mon, 25 Mar 2019 16:37:11 +0900</pubDate><guid>https://nyan101.github.io/blog/CodeJam-Kickstart-2019-RoundA-review/</guid><description>&lt;p&gt;코드잼이 새로운 시스템으로 바뀌었다. 사실 메인 코드잼에선 작년에 도입된 시스템이 올해 킥스타트까지 적용된 거라고 하는데 작년 코드잼은 &lt;del&gt;국방부 전직퀘스트를 해야 했어서&lt;/del&gt; 개인적인 사정으로 참가를 못했으니 이번이 새로운 시스템을 경험하는 첫 대회였다.&lt;/p&gt;&#10;&lt;figure style="width:90%;max-width:100%;margin-left:auto;margin-right:auto;"&gt;&lt;img&#10; class="mx-auto my-0 rounded-md"&#10; style="width:100%"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt=""&#10; src="https://nyan101.github.io/assets/images/2019/03/kickstart-main.png"&#10; &gt;&lt;/figure&gt;&#10;&lt;p&gt;결론부터 말하면 다소 삐걱거리는 출발이었다. 시작 직후 한동안 문제 로딩이 안 되면서 몇 분 후에야 문제를 볼 수 있었고, 제출에서도 다소의 딜레이가 있었다. 거기에 더해 대회 막판에는 아예 제출버튼을 눌러도 코드 제출이 이루어지지 않아서 결국 끝까지 제출하지 못한 상태로 대회가 끝났다. 나름 지난 몇 차례의 킥스타트에서 꾸준히 10~20등 정도의 성적을 내다가 이번에 299등이라는 숫자를 보니 조금 억울하긴 하다(&amp;hellip;)&lt;/p&gt;</description></item><item><title>[Coq 입문] Ch04. Polymorphism &amp; Higher-Order Functions (2)</title><link>https://nyan101.github.io/blog/SW-Foundations-Ch04-2/</link><pubDate>Wed, 27 Feb 2019 19:47:20 +0900</pubDate><guid>https://nyan101.github.io/blog/SW-Foundations-Ch04-2/</guid><description>&lt;h2 class="relative group"&gt;High-Order Functions&#10; &lt;div id="high-order-functions" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#high-order-functions" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;다른 함수를 다룰 수 있는 함수를 고차 함수(higher-order function)라고 한다.&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-coq" data-lang="coq"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;Definition&lt;/span&gt; &lt;span class="n"&gt;do3times&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;)).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-coq" data-lang="coq"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;Check&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;do3times&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;do3times&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;forall&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;이 &lt;code&gt;do3times&lt;/code&gt;는 함수 f와 인자 a를 받아 a에 f를 3번 적용한 결과를 돌려준다. 함수를 인자로 제공한다는게 어떤 의미인지 살펴보자&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-coq" data-lang="coq"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;Definition&lt;/span&gt; &lt;span class="n"&gt;doubleMe&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;nat&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Compute&lt;/span&gt; &lt;span class="n"&gt;do3times&lt;/span&gt; &lt;span class="n"&gt;doubleMe&lt;/span&gt; &lt;span class="n"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;24&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;Filter&#10; &lt;div id="filter" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#filter" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;이제 좀더 유용한 고차 함수들에 대해 알아보자. filter는 X타입의 리스트(list X)와 원소 X에 대한 판정함수(predicate, \(f:X\rightarrow bool\))를 받아 주어진 predicate를 만족하는(i.e. true를 리턴하는) 원소들만을 남긴다.&lt;/p&gt;</description></item><item><title>Codeforces 오렌지(Master) 달성</title><link>https://nyan101.github.io/blog/Codeforces-Master-rankup/</link><pubDate>Sun, 24 Feb 2019 18:45:11 +0900</pubDate><guid>https://nyan101.github.io/blog/Codeforces-Master-rankup/</guid><description>&lt;p&gt;코드포스(&lt;a href="http://codeforces.com/" target="_blank" rel="noreferrer"&gt;http://codeforces.com/&lt;/a&gt;) &lt;span style="font-weight:bold;color:#FF8C00 !important"&gt;Master&lt;/span&gt; 등급(a.k.a. 오렌지)을 달성했다. 그전까지 &lt;span style="font-weight:bold;color:#a0a !important"&gt;Candidate Master&lt;/span&gt;에서 거의 2년간 머무르다가 올해 들어 적극적으로 대회를 참가하기 시작했고, 그 덕분인지 최근 한 달(1.22 ~ 2.24) 동안 rating +241이라는 나름 의미있는 성과를 거두면서 승급에 성공했다. &lt;del&gt;이제 박제해야지&lt;/del&gt;&lt;/p&gt;&#10;&lt;figure style="width:90%;max-width:100%;margin-left:auto;margin-right:auto;"&gt;&lt;img&#10; class="mx-auto my-0 rounded-md"&#10; style="width:100%"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt="코드포스 프로필"&#10; src="https://nyan101.github.io/assets/images/2019/02/CF-my-profile-orange.png"&#10; &gt;&lt;/figure&gt;&#10;&lt;p&gt;최근 대회를 진행하면서 느꼈던 건 (당연한 소리겠지만) 풀 수 있어야 하는 문제를 못 푸는 일은 없어야 한다는 점이었다. 개인적으로는 Div.2 D,E (=Div.1 B,C) 정도를 기준으로 잡았다. 대바대(대회 by 대회)라고는 하지만 이 난이도에서는 대체로 &amp;ldquo;잘 알려진&amp;rdquo;, 혹은 규칙을 파악하면 코딩 자체는 어렵지 않은 문제들이 많다. 아이디어성 문제들은 어쩔 수 없다고 해도, 대회가 끝나고 나서 &amp;ldquo;이걸 왜 두시간동안 못 떠올렸지&amp;quot;라는 아쉬움을 없애자고 생각했다. 특히 &lt;a href="http://codeforces.com/contest/1117/problem/D" target="_blank" rel="noreferrer"&gt;최근 에듀코포 D&lt;/a&gt;에서 대회 종료 직전이 되어서야 풀이를 찾아내면서 이런 생각을 굳혔다. 다행히 지난 라운드에선 &lt;del&gt;F의 밸런스 붕괴에 힘입어&lt;/del&gt; 그런 아쉬움 없이 28등으로 끝마칠 수 있었다.&lt;/p&gt;</description></item><item><title>[Coq 입문] Ch04. Polymorphism &amp; Higher-Order Functions (1)</title><link>https://nyan101.github.io/blog/SW-Foundations-Ch04-1/</link><pubDate>Sun, 17 Feb 2019 22:22:37 +0900</pubDate><guid>https://nyan101.github.io/blog/SW-Foundations-Ch04-1/</guid><description>&lt;h2 class="relative group"&gt;Polymorphic Lists&#10; &lt;div id="polymorphic-lists" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#polymorphic-lists" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;이전 장에서 natlist, 다시 말해 nat으로 이루어진 리스트에 대해 다뤘다. 마찬가지 방법으로 문자열 리스트, bool 리스트, 리스트의 리스트 등 다양한 리스트를 정의할 수 있다. 예를 들어 bool 리스트는&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-coq" data-lang="coq"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;Inductive&lt;/span&gt; &lt;span class="n"&gt;boollist&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Type&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;bool_nil&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;bool_cons&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;boollist&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;로 정의된다.&lt;/p&gt;&#10;&lt;p&gt;그런데 매번 새로운 타입의 리스트가 필요할 때마다 (거의) 동일한 정의를 다시 써주는 건 낭비일 것이다. 새로운 타입에 맞게 정의를 다시 쓴다는 말은 단순히 &lt;code&gt;nil&lt;/code&gt;이나 &lt;code&gt;cons&lt;/code&gt;의 문제가 아니라, length, reverse, append 등 앞서 natlist에서 정의했던 모든 함수를 전부 새로 작성해야 한다는 의미가 된다. 이런 불필요한 중복을 피하기 위해 Coq에서는 &lt;em&gt;다형적(polymorphic)&lt;/em&gt; 타입을 지원한다.&lt;/p&gt;</description></item><item><title>[Coq 입문] Ch03. Working with Structured Data (2)</title><link>https://nyan101.github.io/blog/SW-Foundations-Ch03-2/</link><pubDate>Mon, 11 Feb 2019 22:01:56 +0900</pubDate><guid>https://nyan101.github.io/blog/SW-Foundations-Ch03-2/</guid><description>&lt;h2 class="relative group"&gt;Reasoning About Lists&#10; &lt;div id="reasoning-about-lists" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#reasoning-about-lists" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;리스트에 대한 간단한 정리를 증명해보자.&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-coq" data-lang="coq"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;Theorem&lt;/span&gt; &lt;span class="n"&gt;nil_app&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;forall&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;natlist&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;Proof&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kp"&gt;reflexivity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;Qed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;대상이 natlist라는 점만 제외하면 이전의 &lt;code&gt;forall n:nat, 0+n=n&lt;/code&gt;과 같은 형태이다. nat에서와 마찬가지로 natlist도 &lt;code&gt;destruct&lt;/code&gt;를 통해 생성규칙에 따라 경우를 나눌 수 있다.&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-coq" data-lang="coq"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;Theorem&lt;/span&gt; &lt;span class="n"&gt;tl_length_pred&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;forall&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;natlist&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pred&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tl&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;Proof&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;intros&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;destruct&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="o"&gt;[|&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="n"&gt;l&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="n"&gt;eqn&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="c"&gt;(* l = [] *)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kp"&gt;reflexivity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="c"&gt;(* l = n::l&amp;#39; *)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kp"&gt;reflexivity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;마찬가지로 수학적 귀납법(induction tactic) 역시 적용 가능하다. nat에서의 귀납법과 마찬가지로 base step과 induction step으로 이루어져 있으며, 각각&lt;/p&gt;</description></item><item><title>[Coq 입문] Ch03. Working with Structured Data (1)</title><link>https://nyan101.github.io/blog/SW-Foundations-Ch03-1/</link><pubDate>Sat, 09 Feb 2019 15:33:11 +0900</pubDate><guid>https://nyan101.github.io/blog/SW-Foundations-Ch03-1/</guid><description>&lt;p&gt;본 챕터에서는 Structured Data, 그중에서도 List에 대해 다룬다.&lt;/p&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;Pairs of Numbers&#10; &lt;div id="pairs-of-numbers" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#pairs-of-numbers" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;지난번 &lt;code&gt;nybble&lt;/code&gt;을 정의할 때 언급했듯이, Coq의 생성자(constructor)는 여러 개의 인자를 받을 수 있다.&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-coq" data-lang="coq"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;Inductive&lt;/span&gt; &lt;span class="n"&gt;natprod&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Type&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n1&lt;/span&gt; &lt;span class="n"&gt;n2&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;이렇게 정의된 &lt;code&gt;natprod&lt;/code&gt;에는 오직 하나의 생성규칙만 존재한다.(ex: &lt;code&gt;pair 3 5&lt;/code&gt;)&lt;/p&gt;</description></item><item><title>[Coq 입문] Ch02. Proof by tactics (2)</title><link>https://nyan101.github.io/blog/SW-Foundations-Ch02-2/</link><pubDate>Sun, 03 Feb 2019 22:16:28 +0900</pubDate><guid>https://nyan101.github.io/blog/SW-Foundations-Ch02-2/</guid><description>&lt;h2 class="relative group"&gt;Proof by Case Analysis&#10; &lt;div id="proof-by-case-analysis" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#proof-by-case-analysis" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;다뤄야 하는 대상이 복잡해지면 &lt;code&gt;simpl&lt;/code&gt;이나 &lt;code&gt;rewrite&lt;/code&gt;만으로는 충분하지 않은 경우가 있다. 잠시 &lt;a href="https://nyan101.github.io/blog/SW-Foundations-Ch01-2/" &gt;예전 글&lt;/a&gt;에서 정의했던 &lt;code&gt;is_equal&lt;/code&gt;을 가져오면서 여기에 새로운 Notation을 추가하자.&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-coq" data-lang="coq"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;Fixpoint&lt;/span&gt; &lt;span class="n"&gt;is_equal&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;O&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;O&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="n"&gt;m&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="n"&gt;n&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;O&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="n"&gt;m&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;is_equal&lt;/span&gt; &lt;span class="n"&gt;n&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;m&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;Notation&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;x =? y&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eqb&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="n"&gt;70&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;nat_scope&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;이제 거의 비슷하게 생긴 다음 두 명제를 증명해보자.&lt;/p&gt;</description></item><item><title>[Coq 입문] Ch02. Proof by tactics (1)</title><link>https://nyan101.github.io/blog/SW-Foundations-Ch02-1/</link><pubDate>Fri, 01 Feb 2019 20:15:17 +0900</pubDate><guid>https://nyan101.github.io/blog/SW-Foundations-Ch02-1/</guid><description>&lt;p&gt;이제 Coq를 이용해 간단한 증명을 직접 작성해보자.&lt;/p&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;Notation&#10; &lt;div id="notation" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#notation" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;본론을 시작하기에 앞서 전에 만들었던 &lt;code&gt;plus&lt;/code&gt;, &lt;code&gt;mult&lt;/code&gt; 에 infix notation을 정의하자.&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-coq" data-lang="coq"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;Notation&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;x + y&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plus&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="n"&gt;50&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;left&lt;/span&gt; &lt;span class="n"&gt;associativity&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;nat_scope&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;Notation&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;x * y&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mult&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="n"&gt;40&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;left&lt;/span&gt; &lt;span class="n"&gt;associativity&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;nat_scope&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;이전에 &lt;code&gt;bool&lt;/code&gt;에 대해 &lt;code&gt;x &amp;amp;&amp;amp; y&lt;/code&gt; 를 정의하던 때보다 뭔가 이것저것 늘어났다. prefix, postfix notation과는 달리 infix notation에서는 모호한(ambiguous) 문장이 생길 수 있다. 일반적으로 (x+y*z)라는 표현식을 쓸 때 우리는 ((x+y)*z)가 아닌 (x+(y*z))를 의도한다. 위 코드에서의 역할을 간단히 요약하면&lt;/p&gt;</description></item><item><title>[Coq 입문] Ch01. Functional Programming in Coq (2)</title><link>https://nyan101.github.io/blog/SW-Foundations-Ch01-2/</link><pubDate>Thu, 31 Jan 2019 20:01:32 +0900</pubDate><guid>https://nyan101.github.io/blog/SW-Foundations-Ch01-2/</guid><description>&lt;h2 class="relative group"&gt;Define Numbers&#10; &lt;div id="define-numbers" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#define-numbers" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;이전 글에서는 &lt;code&gt;day&lt;/code&gt;, &lt;code&gt;bool&lt;/code&gt;, &lt;code&gt;color&lt;/code&gt; 와 같이 원소의 개수가 유한한 타입, 다시 말해 타입 \(T\)에 대해 \(\{x \| x \mathrm\{\,has\,type\,\}T\} \)가 유한집합인 경우만을 다뤘다. 무한한 원소를 가지는 타입을 정의하려면 어떻게 해야 할까? 집합론에서와 마찬가지로 자연수에서 시작해보자. 페아노 공리계(&lt;a href="https://en.wikipedia.org/wiki/Peano_axioms#Formulation" target="_blank" rel="noreferrer"&gt;Peano axioms&lt;/a&gt;)에서 필요한 부분을 빌려오자. 크게 중요하지 않은 공리들은 생략했다&lt;/p&gt;</description></item><item><title>[Coq 입문] Ch01. Functional Programming in Coq (1)</title><link>https://nyan101.github.io/blog/SW-Foundations-Ch01-1/</link><pubDate>Tue, 29 Jan 2019 00:47:23 +0900</pubDate><guid>https://nyan101.github.io/blog/SW-Foundations-Ch01-1/</guid><description>&lt;h2 class="relative group"&gt;Introduction&#10; &lt;div id="introduction" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#introduction" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;여기서는 Coq에서 사용되는 Galina라는 functional programming language의 기초적인 사용법과, Coq에서 증명에 실제 활용되는 기초적인 tactic에 대해 다룬다.&lt;/p&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;Data and Functions&#10; &lt;div id="data-and-functions" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#data-and-functions" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&#10;&#10;&lt;h3 class="relative group"&gt;Days of the Week&#10; &lt;div id="days-of-the-week" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#days-of-the-week" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h3&gt;&#10;&lt;p&gt;먼저 Coq에서 타입을 선언하는 법을 알아보자. 모든 Coq 구문은 .(마침표)로 끝남에 유의하자&lt;/p&gt;</description></item><item><title>[Coq 입문] Ch00. Overview</title><link>https://nyan101.github.io/blog/SW-Foundations-Ch00/</link><pubDate>Mon, 28 Jan 2019 21:02:16 +0900</pubDate><guid>https://nyan101.github.io/blog/SW-Foundations-Ch00/</guid><description>&lt;p&gt;Coq를 공부해보겠다는 막연한 목표와 함께 이런저런 자료를 찾아보고 그만두기를 반복하던 중, &lt;a href="https://deepspec.org/event/dsss18/" target="_blank" rel="noreferrer"&gt;DeepSpec Summer School&lt;/a&gt; 세미나에서 나온 영상을 발견했다. 유투브에서 찾은 다른 영상들이 4,5년 전 자료였던 반면 DeepSpec에서는 최근인 2017, 2018년까지 꾸준히 학습자료와 세미나 영상이 업로드되고 있다.&lt;/p&gt;&#10;&lt;p&gt;사실 예전 LaTeX을 익힐 때에도 이것저것 찾아보기만 하다가 결국 학교 과제를 LaTeX으로 작성해보고서야 익숙해졌는데, 이번에도 실 사용 없이 공부하는게 얼마나 갈지는 잘 모르겠다.. 자료 초반에 &lt;em&gt;&amp;ldquo;All the core chapters are suitable for both upper-level undergraduate and graduate students.&amp;rdquo;&lt;/em&gt; 라는 말이 있던데, &lt;del&gt;물론 저런 말들이 다 그렇듯이 전부 거짓말이겠지만&lt;/del&gt; 이젠 undergraduate 신분이라는 핑계도 사라졌으니 좀더 확실히 짚고 넘어가야겠다는 생각도 든다.&lt;/p&gt;</description></item><item><title>이데일리 Coding Challenge 후기</title><link>https://nyan101.github.io/blog/edaily-Coding-Challenge-2018-review/</link><pubDate>Wed, 07 Nov 2018 21:56:05 +0900</pubDate><guid>https://nyan101.github.io/blog/edaily-Coding-Challenge-2018-review/</guid><description>&lt;p&gt;동아리 톡방에서 이데일리 코딩대회에 대한 소식을 들었다. 학부를 졸업했지만 아직 대학원생은 아니라는 애매한 신분 때문에 대부분의 대회를 참가하지 못했었는데, 이번 대회는 청소년부/성인부로만 나뉘어져 있어 참가신청을 할 수 있었다.&lt;/p&gt;&#10;&lt;figure style="width:90%;max-width:100%;margin-left:auto;margin-right:auto;"&gt;&lt;img&#10; class="mx-auto my-0 rounded-md"&#10; style="width:100%"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt=""&#10; src="https://nyan101.github.io/assets/images/2018/11/edaily-title.png"&#10; &gt;&lt;/figure&gt;&#10;&#10;&#10;&lt;h3 class="relative group"&gt;예선&#10; &lt;div id="예선" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%ec%98%88%ec%84%a0" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h3&gt;&#10;&lt;p&gt;10월 26일 온라인 예선이 다가오자 안내문자가 날아왔는데, 처음엔 눈을 의심했다. 48시간 대회라는 점도 특이했지만 &lt;strong&gt;120문제&lt;/strong&gt;라는 엄청난 문제 수에선 말이 나오지 않았다. 다른 대회들이 보통 3~5시간 동안 5문제, 팀으로 진행하는 ICPC도 많아야 12,13문제를 내는데 예선에서부터 120문제라는 공지를 보고 과연 어떤 문제들이 나올지 기대(?)되기도 했다.&lt;/p&gt;</description></item><item><title>Code Jam Kickstart 2018 Round G 후기</title><link>https://nyan101.github.io/blog/CodeJam-Kickstart-2018-RoundG-review/</link><pubDate>Tue, 23 Oct 2018 23:56:03 +0900</pubDate><guid>https://nyan101.github.io/blog/CodeJam-Kickstart-2018-RoundG-review/</guid><description>&lt;p&gt;어째 코드잼 관련 글만 계속 올라오는 것 같다.. 여튼 이틀 전 Code Jam Kickstart Round G가 있길래 참가했다. 일요일 오후 10시라는 시간대가 조금 걸렸지만 &lt;strong&gt;월요일 연차휴가&lt;/strong&gt;라는 사실에 힘입어 대회를 치르기로 했다.&lt;/p&gt;&#10;&lt;p&gt;대회 초반에 빠르게 문제를 풀고 중간 등수가 6등까지 올라갔다. 남은 1시간 반 동안 C 라지를 마저 풀까 하다가 exponential 한 알고리즘밖에 떠오르지 않길래 gg 후 웹툰으로 넘어갔다.&lt;/p&gt;</description></item><item><title>Facebook Hacker Cup 2018 후기</title><link>https://nyan101.github.io/blog/facebook-hackercup-2018-review/</link><pubDate>Sun, 05 Aug 2018 05:12:07 +0900</pubDate><guid>https://nyan101.github.io/blog/facebook-hackercup-2018-review/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR : 로컬의 문제점을 깨닫지 못하고 폭사(&amp;hellip;)&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;페이스북 해커컵이 끝났다. 구글 코드잼 본대회는 대회 당시 인터넷을 쓸 수 없는 환경(&amp;hellip;)에 있어서 아쉬운 마음이었는데, 다행히 해커컵은 일정이 맞아 모두 참가할 수 있었다. 생각치 못한 실수로 Round 2에서 탈락했지만 각 라운드를 간단히 요약해봤다.&lt;/p&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;Qualification Round&#10; &lt;div id="qualification-round" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#qualification-round" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;당시 아직 &amp;lsquo;전직&amp;rsquo;을 한 상태가 아니었지만 주말이라 외출을 할 수 있었다. 대전의 한 PC방에서 파이썬3을 다운받아 대회를 진행했다.&lt;/p&gt;</description></item><item><title>Code Jam Kickstart 2018 Round D 후기</title><link>https://nyan101.github.io/blog/CodeJam-Kickstart-2018-RoundD-review/</link><pubDate>Fri, 03 Aug 2018 20:24:03 +0900</pubDate><guid>https://nyan101.github.io/blog/CodeJam-Kickstart-2018-RoundD-review/</guid><description>&lt;p&gt;공식적으로 전직(&amp;hellip;)을 했지만 가능한 한 PS대회는 계속 나가보고 싶었다. SCPC나 UCPC는 이제 대학생이 아니라 참가를 못했지만, 지난 주말에 Code Jam Kickstart Round D가 있어 여기 참가해볼 수 있었다. 코드잼 킥스타트에 대한 설명은 &lt;a href="https://nyan101.github.io/blog/CodeJam-Kickstart-2018-RoundC-review/" &gt;Round C 후기&lt;/a&gt;에서 한번 작성한 바 있으니 이 글에서는 생략했다.&lt;/p&gt;&#10;&lt;p&gt;이날 대회는 오후 2시부터 열렸는데, 내가 3시부터 세미나가 있어 그전까지는 약속장소 근처 스타벅스, 이후엔 세미나실에서 틈틈히 코딩을 진행했다. 저번 Round C를 1시간 20분만에 올클했었기에 이번에도 비슷하게 걸리지 않을까라는 &lt;del&gt;근자감이 가득한&lt;/del&gt; 예상을 했지만 A를 보는 순간 그런 기대는 깔끔하게 접혔다. 결국 C에 와서는 &amp;ldquo;그냥 small만 통과하자&amp;quot;라는 마음으로 small 전용 코드를 짜서 제출하고 다시 세미나에 합류했다.&lt;/p&gt;</description></item><item><title>Code Jam Kickstart 2018 Round C 후기</title><link>https://nyan101.github.io/blog/CodeJam-Kickstart-2018-RoundC-review/</link><pubDate>Sun, 27 May 2018 00:00:01 +0900</pubDate><guid>https://nyan101.github.io/blog/CodeJam-Kickstart-2018-RoundC-review/</guid><description>&lt;p&gt;한동안 개인 사정으로 인해 다른 일을 할 수 없어 Google Code Jam 본대회 Qualification Round를 불참했는데, 마침 오늘 Code Jam Kickstart 가 있길래 참가해봤다.&lt;/p&gt;&#10;&lt;figure style="width:90%;max-width:100%;margin-left:auto;margin-right:auto;"&gt;&lt;img&#10; class="mx-auto my-0 rounded-md"&#10; style="width:100%"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt=""&#10; src="https://nyan101.github.io/assets/images/2018/05/kickstart-title.png"&#10; &gt;&lt;/figure&gt;&#10;&lt;p&gt;Kickstart는 CodeJam 본대회와 달리 비교적 자주 진행되고(2017년 기준 7회), 다양한 시간대에 분포해 있어 &lt;del&gt;코포처럼&lt;/del&gt; 새벽까지 깨어있지 않아도 참가할 수 있다. 대회 자체적으로 상을 주지는 않지만 좋은 성적을 낼 경우 구글에서 인턴/입사 인터뷰 메일이 오기도 하니 시간이 된다면 참가해보자. &lt;del&gt;실제로 2017년 Kickstart Round G 때 15등 찍어서 메일 받아봄.&lt;/del&gt;&lt;/p&gt;</description></item><item><title>Coq 02 - 자연수 덧셈의 결합법칙 증명</title><link>https://nyan101.github.io/blog/Coq-02-mynat/</link><pubDate>Mon, 08 Jan 2018 02:24:01 +0900</pubDate><guid>https://nyan101.github.io/blog/Coq-02-mynat/</guid><description>&lt;p&gt;대부분의 reference가 그렇듯이 읽다보면 쉽게 지루해진다. 지루함을 덜하고 Coq에 익숙해지기 위해 일단 예제를 조금씩 따라해보면서 익혀가기로 했다. 자바를 처음 배울 때 &lt;em&gt;public static void main(int argv, char **argc)&lt;/em&gt;가 정확히 뭔지는 몰라도 &amp;ldquo;Hello World&amp;rdquo; 부터 찍어보는 그런 마음으로 진행해봤다.&lt;/p&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;CoqIDE 실행&#10; &lt;div id="coqide-실행" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#coqide-%ec%8b%a4%ed%96%89" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;프로그램을 처음 실행하면 다음과 같은 화면을 볼 수 있다. 크게 3가지 창으로 나뉘어져 있으며, 왼쪽은 코드 작성을, 오른쪽 위/아래는 각각 Proof 보조/결과 출력을 담당하는 역할이었다.&lt;/p&gt;</description></item><item><title>Coq 01 - Introduction</title><link>https://nyan101.github.io/blog/Coq-01-intro/</link><pubDate>Thu, 04 Jan 2018 12:42:31 +0900</pubDate><guid>https://nyan101.github.io/blog/Coq-01-intro/</guid><description>&lt;p&gt;&amp;lt;Interactive Theorem Proving and Program Development&amp;gt;라는 책을 추천받아 조금씩 읽어보기로 했다. 첫 장에서는 Coq에 대한 간단한 안내를 진행한다. 책의 순서를 따라가면서 하나씩 알아보자&lt;/p&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;타입&#10; &lt;div id="타입" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%ed%83%80%ec%9e%85" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;먼저 Coq에서는 Gallina라는 언어를 사용해 요구사항(Specification)을 서술한다. 대부분의 다른 프로그래밍 언어들과 마찬가지로 타입은 declaration과 typing rule에 의해 정해진다.&lt;/p&gt;</description></item><item><title>SCPC 2017 후기</title><link>https://nyan101.github.io/blog/SCPC-2017-review/</link><pubDate>Sat, 19 Aug 2017 00:00:01 +0900</pubDate><guid>https://nyan101.github.io/blog/SCPC-2017-review/</guid><description>&lt;p&gt;지난 8월 17일 삼성전자 서울 R&amp;amp;D캠퍼스에서 열린 SCPC(Samsung Collegiate Programming Cup) 본선대회에 참가했다. 2015년 1회 대회부터 계속 본선까지만 진출하고 막상 수상은 못했어서 이번이 사실상 마지막 기회였는데, 졸업 전 마지막 대회라 운이 좋았는지 4등상(+200만원)을 받아갈 수 있었다.&lt;/p&gt;&#10;&lt;figure style="width:90%;max-width:100%;margin-left:auto;margin-right:auto;"&gt;&lt;img&#10; class="mx-auto my-0 rounded-md"&#10; style="width:100%"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt=""&#10; src="https://nyan101.github.io/assets/images/2017/08/SCPC2017-workspace.jpg"&#10; &gt;&lt;/figure&gt;&#10;&lt;p&gt;개인별로 사진과 같은 환경이 제공되었고 저기서 노트북이랑 책상 빼고는 전부 집으로 가져갈 수 있었다. &lt;del&gt;메인은 역시 기계식키보드&lt;/del&gt;&lt;/p&gt;</description></item><item><title>소수 판별 튜링머신</title><link>https://nyan101.github.io/blog/primality-test-Turing-Machine/</link><pubDate>Sat, 05 Aug 2017 00:00:01 +0900</pubDate><guid>https://nyan101.github.io/blog/primality-test-Turing-Machine/</guid><description>&lt;p&gt;이번 SCTF(Samsung CTF)의 700점짜리 문제로 &lt;strong&gt;튜링머신 설계&lt;/strong&gt;가 나왔다. 총 4개의 문제 중 3개는 일반적인 오토마타 교과서에서 다루는 언어들(ex: \(L=\{ 0^n1^n | n \geq 0 \}\))이었지만 마지막 단계인 \(L=\{0^p | p \, \mathrm{\,is\,prime}\}\)가 다소 많은 시간을 잡아먹었다. 사실상 소수 판별을 하는 튜링 머신을 설계하라는 문제였는데, 기억상 다른 교재들에서도 이에 대한 명확한 실례는 나와있지 않아 따로 정리했다.&#10;아래 등장하는 그래프의 화살표에서 &lt;code&gt;A/B . P&lt;/code&gt;는 &amp;ldquo;현재 state에서 알파벳 A를 읽었을 때, 테이프에 B를 쓰고 P방향(L, 또는 R)으로 이동한다&amp;quot;라는 의미를 가진다. 이제 필요한 서브루틴을 하나씩 구성해 보자.&lt;/p&gt;</description></item></channel></rss>