<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>김신건의 로그</title><description>개발자 김신건(koa)의 개발 블로그 — Python, Django, Astro, 알고리즘(백준/PS), 웹 개발, 데이터베이스를 기록하는 글·노트·위키.</description><link>https://shinkeonkim.com/</link><language>ko-KR</language><item><title>IaC 튜토리얼 (1)</title><link>https://shinkeonkim.com/posts/iac-tutorial/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/iac-tutorial/</guid><description>IaC(Infrastructure as Code) 개념과 도구들을 소개하는 튜토리얼</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;iac란&quot;&gt;IaC란?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
한줄 정리
서버·네트워크·DB 같은 인프라를 사람이 손으로 클릭해 만드는 대신, 버전 관리되는 코드(설정 파일)
로 정의하고 자동으로 프로비저닝하는 방식&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;어떻게 만들지(절차)가 아니라 무엇을 원하는지(상태)를 적는 선언형 방식이 IaC의 주류다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://shinkeonkim.com/uploads/20260611172849-makqga-image.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;요약-정리&quot;&gt;요약 정리&lt;/h3&gt;
&lt;p&gt;IaC는 인프라의 &lt;strong&gt;“원하는 상태(desired state)”&lt;/strong&gt; 를 텍스트 파일로 기술하고, 도구가 그 정의대로 실제 클라우드/온프레미스 자원을 만들고 변경·삭제하도록 하는 운영 패러다임입니다.&lt;/p&gt;
&lt;p&gt;콘솔에서 수동으로 만든 자원은 누가/언제/무엇을 바꿨는지 추적이 어렵고, 재현이 불가능합니다. IaC는 이 과정을 코드로 옮겨 Git으로 이력을 남기고, 코드 리뷰를 거치고, 동일한 정의로 몇 번이든 같은 환경을 재생산할 수 있습니다.&lt;/p&gt;
&lt;p&gt;결과적으로 인프라가 소프트웨어 개발의 모범 사례(버전 관리·테스트·CI/CD· 리뷰)를 그대로 누리게 됩니다.&lt;/p&gt;
&lt;h3 id=&quot;코드로-정의하면-따라오는-것들&quot;&gt;코드로 정의하면 따라오는 것들&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Single Source of Truth : 실제 인프라의 구조는 코드 저장소가 말해줍니다.&lt;/li&gt;
&lt;li&gt;리뷰 가능성: 인프라 변경이 PR로 들어와, 동료의 검토를 받습니다. (이제 AI의 작성과 리뷰도 받을 수 있습니다.)&lt;/li&gt;
&lt;li&gt;자동화: apply 한번으로 수십 개의 자원을 일관되게 생성합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;iac의-이점&quot;&gt;IaC의 이점&lt;/h2&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;이점&lt;/th&gt;&lt;th&gt;무엇을 해결하는가?&lt;/th&gt;&lt;th&gt;구체적인 효과&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;재현성 / 멱등성&lt;/td&gt;&lt;td&gt;환경 간 불일치, 재해 복구&lt;/td&gt;&lt;td&gt;동일 코드로 dev-alpha-production 등의 환경에 동일하게 생성 가능. 여러 번 apply해도 결과가 동일함&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;버전 관리&lt;/td&gt;&lt;td&gt;”누가 이걸 지웠는가?”&lt;/td&gt;&lt;td&gt;Git Diff로 변경 추적이 가능함&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;협업 / 리뷰&lt;/td&gt;&lt;td&gt;사일로화된 인프라 지식&lt;/td&gt;&lt;td&gt;인프라 변경이 코드 리뷰 대상이 되어 지식이 팀에 공유된다.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;속도 / 자동화&lt;/td&gt;&lt;td&gt;느린 수동 프로피저닝&lt;/td&gt;&lt;td&gt;CI/CD 파이프라인에서 plan / apply를 자동 실행&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;일관성&lt;/td&gt;&lt;td&gt;휴먼 에러, Contribution Drift&lt;/td&gt;&lt;td&gt;클릭 실수 제거, 정책을 코드로 강제할 수 있음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;문서화&lt;/td&gt;&lt;td&gt;오래된 위키&lt;/td&gt;&lt;td&gt;코드 자체가 항상 최신 인프라를 명세하는 명세서 역할을 함&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;비용 / 보안 가시성&lt;/td&gt;&lt;td&gt;유령 자원, 미흡한 점검&lt;/td&gt;&lt;td&gt;정적 분석 (tfsec, Checkov) 으로 배포 전에 위험, 낭비를 탐지할 수 있음&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;IaC에서 멱등성은 매우 중요합니다. 명령형 스크립트를 통해 인프라 생성시, 단순하게 두 번 실행하면 자원을 2개 만들어낼 수 있습니다. 선언형 IaC는 “이미 원하는 상태” 라면 아무 일도 하지 않습니다. 이 성질로 “안전하고 다시 돌릴 수 있는” 자동화를 가능하게 만들어줍니다.&lt;/p&gt;
&lt;h2 id=&quot;명령형-vs-선언형-그리고-state에-대해&quot;&gt;명령형 vs 선언형 그리고 state에 대해&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://shinkeonkim.com/uploads/20260611173623-yu9tr8-image.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;명령형imperative&quot;&gt;명령형(imperative)&lt;/h4&gt;
&lt;p&gt;“EC2 인스턴스를 생성하라 → 보안그룹을 붙여라 → 태그를 달아라”처럼 수행할 단계를 순서대로 기술합니다.
(예: 셸 스크립트, AWS CLI 나열) 다시 실행하면 중복 생성·오류가 날 수 있어 멱등하지 않습니다.&lt;/p&gt;
&lt;h4 id=&quot;선언형declarative&quot;&gt;선언형(declarative)&lt;/h4&gt;
&lt;p&gt;“t3.micro EC2가 1대, 이 보안그룹과 함께, 이 태그로 존재해야 한다”처럼 결과만 기술합니다.
도구가 현재와 비교해 필요한 동작을 스스로 도출합니다. (ex. Terraform, CloudFormation, Kubernetes manifest)&lt;/p&gt;
&lt;h3 id=&quot;선언형-iac-도구가-동작하는-방식&quot;&gt;선언형 IaC 도구가 동작하는 방식&lt;/h3&gt;
&lt;p&gt;선언형 도구는 세 가지를 비교합니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;코드에 적힌 목표 상태(desired)&lt;/li&gt;
&lt;li&gt;도구가 기억하는 마지막 상태(state file)&lt;/li&gt;
&lt;li&gt;클라우드의 실제 상태(real)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;plan 단계에서 이 셋을 대조하여 “무엇을 만들고/바꾸고/지울지”를 실행 계획으로 보여줍니다. apply 단계에서 그 계획만큼만 실제 API를 호출합니다.
코드와 실제가 어긋나는 현상을 드리프트(drift)라 하며, 도구는 이를 감지해 다시 코드 기준으로 맞춰 줍니다. 이 “목표-현재 차이 계산” 모델이 IaC가 멱등하고 안전한 이유입니다.&lt;/p&gt;</content:encoded><category>tutorial</category><category>IaC</category><author>koa (김신건)</author></item><item><title>CodeWithOutput 컴포넌트 데모</title><link>https://shinkeonkim.com/posts/code-with-output-showcase/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/code-with-output-showcase/</guid><description>CodeWithOutput 컴포넌트가 지원하는 모든 사용 패턴 — 단일/다중 STDIN·STDOUT, 다중 언어 변형, 라벨/타이틀, 반응형, 엣지 케이스까지 한 번에 확인할 수 있도록 모아둔 데모 페이지.</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;이 글은 &lt;code&gt;&amp;#x3C;CodeWithOutput&gt;&lt;/code&gt; 컴포넌트의 모든 표현 가능한 형태를 한 화면에서 확인하기 위한 데모입니다.
&lt;code&gt;&amp;#x3C;!-- mdx-component: CodeWithOutput --&gt;&lt;/code&gt; 는 &lt;code&gt;astro-auto-import&lt;/code&gt; 로 글로벌 등록되어 있어 글마다 import 문을 추가할 필요가 없습니다.
새 케이스가 추가될 때마다 이 페이지에 예시를 같이 추가하면 미리보기·실제 빌드·반응형 동작을 한 번에 점검할 수 있습니다.&lt;/p&gt;
&lt;h2 id=&quot;1-기본--코드--결과&quot;&gt;1. 기본 — 코드 + 결과&lt;/h2&gt;
&lt;p&gt;가장 단순한 형태입니다. 코드 한 덩어리 + 결과 한 덩어리.&lt;/p&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;h2 id=&quot;2-stdin--stdout-한-쌍&quot;&gt;2. STDIN + STDOUT 한 쌍&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;input&lt;/code&gt; 을 함께 넘기면 결과 패널 위에 stdin 섹션이 추가됩니다.&lt;/p&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;h2 id=&quot;3-여러-테스트-케이스-cases&quot;&gt;3. 여러 테스트 케이스 (&lt;code&gt;cases&lt;/code&gt;)&lt;/h2&gt;
&lt;p&gt;알고리즘 문제처럼 입력·출력 쌍이 여러 개 필요한 경우 &lt;code&gt;cases&lt;/code&gt; 배열을 사용합니다.
모든 케이스가 한 번에 보이도록 세로로 쌓이고, 케이스 사이는 굵은 경계선으로 구분합니다.
라벨을 생략하면 &lt;code&gt;예제 N&lt;/code&gt; 으로 자동 부여됩니다.&lt;/p&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;h2 id=&quot;4-사용자-지정-케이스-라벨&quot;&gt;4. 사용자 지정 케이스 라벨&lt;/h2&gt;
&lt;p&gt;각 케이스에 &lt;code&gt;label&lt;/code&gt; 을 명시하면 자동 번호 대신 사용자 라벨이 보입니다.&lt;/p&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;h2 id=&quot;5-다중-언어-코드-variants&quot;&gt;5. 다중 언어 코드 (&lt;code&gt;variants&lt;/code&gt;)&lt;/h2&gt;
&lt;p&gt;같은 문제를 여러 언어로 풀이할 때 &lt;code&gt;variants&lt;/code&gt; 로 코드 패널에 탭을 만들 수 있습니다.
오른쪽 패널의 결과는 모든 변형이 공유합니다.&lt;/p&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;h2 id=&quot;6-다중-언어--다중-케이스&quot;&gt;6. 다중 언어 + 다중 케이스&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;variants&lt;/code&gt; 와 &lt;code&gt;cases&lt;/code&gt; 는 함께 쓸 수 있습니다. 코드는 탭으로, 케이스는 세로 stack 으로.&lt;/p&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;h2 id=&quot;7-케이스마다-입력-유무가-섞여-있을-때&quot;&gt;7. 케이스마다 입력 유무가 섞여 있을 때&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;cases&lt;/code&gt; 안에서 어떤 케이스는 입력이 있고 어떤 케이스는 없는 경우. 각 케이스는 독립적으로 stdin 섹션을 표시/숨김.&lt;/p&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;h2 id=&quot;8-타이틀과-커스텀-라벨&quot;&gt;8. 타이틀과 커스텀 라벨&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;title&lt;/code&gt;, &lt;code&gt;outputLabel&lt;/code&gt;, 케이스별 &lt;code&gt;inputLabel&lt;/code&gt; / &lt;code&gt;outputLabel&lt;/code&gt; 까지 모두 지정한 풀 옵션 예시.&lt;/p&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;h2 id=&quot;9-좌우-비율-조절-codewidth&quot;&gt;9. 좌우 비율 조절 (&lt;code&gt;codeWidth&lt;/code&gt;)&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;codeWidth&lt;/code&gt; prop 으로 초기 좌측 코드 패널 너비를 조절할 수 있습니다 (사용자가 splitter 를 드래그하면 localStorage 에 저장됨).&lt;/p&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;h2 id=&quot;10-긴-코드--긴-출력-스크롤-확인&quot;&gt;10. 긴 코드 / 긴 출력 (스크롤 확인)&lt;/h2&gt;
&lt;p&gt;코드와 출력이 패널 높이를 넘으면 각 패널 내부에서 독립 스크롤됩니다.&lt;/p&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;h2 id=&quot;11-긴-한-줄-가로-스크롤-확인&quot;&gt;11. 긴 한 줄 (가로 스크롤 확인)&lt;/h2&gt;
&lt;p&gt;긴 단일 라인은 패널 안에서 가로 스크롤이 동작해야 합니다.&lt;/p&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;h2 id=&quot;12-다양한-언어-하이라이팅&quot;&gt;12. 다양한 언어 하이라이팅&lt;/h2&gt;
&lt;p&gt;shiki 가 인식 가능한 언어라면 자동으로 색상이 적용됩니다.&lt;/p&gt;
&lt;p&gt;&amp;#x3C;CodeWithOutput
language=“rust”
label=“Rust”
outputLanguage=“text”
code={&lt;code&gt;fn main() {\n    let v: Vec&amp;#x3C;i32&gt; = (1..=5).collect();\n    let sum: i32 = v.iter().sum();\n    println!(&quot;sum = {}&quot;, sum);\n}&lt;/code&gt;}
output={&lt;code&gt;sum = 15&lt;/code&gt;}
/&gt;&lt;/p&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;h2 id=&quot;확인-포인트&quot;&gt;확인 포인트&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;좌우 splitter 드래그로 비율 조절이 동작하는가&lt;/li&gt;
&lt;li&gt;더블클릭 시 50% 로 리셋되는가&lt;/li&gt;
&lt;li&gt;화살표 키로 미세 조정되는가&lt;/li&gt;
&lt;li&gt;모바일 폭 (640px 이하) 에서 splitter 가 사라지고 세로 stack 으로 전환되는가&lt;/li&gt;
&lt;li&gt;다크/라이트 모드 전환 시 코드 색상이 따라가는가&lt;/li&gt;
&lt;li&gt;다중 케이스에서 케이스 간 경계선이 명확한가&lt;/li&gt;
&lt;li&gt;미리보기 (에디터) 와 실제 렌더링이 시각적으로 동일한가&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>meta</category><category>demo</category><author>koa (김신건)</author></item><item><title>[Leetcode] 192 Word Frequency</title><link>https://shinkeonkim.com/posts/problem-solving/leetcode/shell/192-word-frequency/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/problem-solving/leetcode/shell/192-word-frequency/</guid><description>Leetcode 192번 문제 풀이입니다.</description><pubDate>Mon, 25 May 2026 09:35:44 GMT</pubDate><content:encoded>&lt;h2 id=&quot;문제-요약-및-풀이&quot;&gt;문제 요약 및 풀이&lt;/h2&gt;
&lt;p&gt;file.txt가 주어질 때, 각 단어의 빈도수를 계산하여 단어와 빈도수를 출력하는 한 줄짜리 [[Shell Script]]를 작성해야 한다.&lt;/p&gt;
&lt;p&gt;이때 빈도수에 따라 내림차순으로 정렬해야 하고, 빈도수가 같은 경우는 주어지지 않는다고 가정한다.&lt;/p&gt;
&lt;p&gt;스크립트로 작성하려면 어떻게 해야하나 고민하다가 sort + uniq -c 조합으로 단어의 빈도수를 계산 할 수 있다고 생각했고, 실행해보았다.
근데 빈도수의 오름차순으로 정렬이 되어서 sort -r 옵션을 추가해서 내림차순으로 정렬하도록 했다.&lt;/p&gt;
&lt;h2 id=&quot;풀이-코드&quot;&gt;풀이 코드&lt;/h2&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;</content:encoded><category>Leetcode</category><author>koa (김신건)</author></item><item><title>[Leetcode] 195 Tenth Line</title><link>https://shinkeonkim.com/posts/problem-solving/leetcode/shell/195-tenth-line/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/problem-solving/leetcode/shell/195-tenth-line/</guid><description>Leetcode 195번 문제 풀이입니다.</description><pubDate>Mon, 25 May 2026 09:14:23 GMT</pubDate><content:encoded>&lt;h2 id=&quot;문제-요약-및-풀이&quot;&gt;문제 요약 및 풀이&lt;/h2&gt;
&lt;p&gt;file.txt가 주어질 때, 정확하게 10번째 줄에 있는 텍스트를 출력하는 한 줄짜리 [[Shell Script]]를 작성해야 한다.&lt;/p&gt;
&lt;p&gt;처음에는 head와 tail로 바로 간단하게 할 수 있을 것 같았다.&lt;/p&gt;
&lt;p&gt;아래와 같이 10줄 미만의 입력이 주어지면 정확하게 10번째 라인이 아닌 마지막 라인을 출력하게 됨을 놓쳤다.&lt;/p&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;p&gt;이를 수정하기 위해서 sed를 사용했고, 다음과 같은 풀이를 작성했다.&lt;/p&gt;
&lt;h2 id=&quot;풀이-코드&quot;&gt;풀이 코드&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sed&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;10p&apos;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; file.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded><category>Leetcode</category><author>koa (김신건)</author></item><item><title>[Leetcode] 193 Valid Phone Numbers</title><link>https://shinkeonkim.com/posts/problem-solving/leetcode/shell/193-valid-phone-numbers/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/problem-solving/leetcode/shell/193-valid-phone-numbers/</guid><description>Leetcode 193번 문제 풀이입니다.</description><pubDate>Mon, 25 May 2026 08:14:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;문제-요약-및-풀이&quot;&gt;문제 요약 및 풀이&lt;/h2&gt;
&lt;p&gt;file.txt가 주어질 때, (xxx) xxx-xxxx or xxx-xxx-xxxx 형태의 전화번호를 모두 출력하는 한 줄짜리 [[Shell Script]]를 작성해야 한다.&lt;/p&gt;
&lt;p&gt;신경써야했던 부분은&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;괄호가 있는 경우와 없는 경우의 두 케이스를 구분해야 한다.&lt;/li&gt;
&lt;li&gt;앞, 뒤에 의미없는 문자들이 들어오는 케이스가 있을 수 있다.&lt;/li&gt;
&lt;li&gt;숫자가 아닌 문자들이 들어오는 케이스가 있을 수 있다.&lt;/li&gt;
&lt;li&gt;각 숫자의 개수도 정확히 맞아야 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;풀이-코드&quot;&gt;풀이 코드&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;grep&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -E&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;(^[0-9]{3}-[0-9]{3}-[0-9]{4}$)|^(\([0-9]{3}\) [0-9]{3}-[0-9]{4}$)&apos;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; file.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded><category>Leetcode</category><author>koa (김신건)</author></item><item><title>캐시 적용이 적절한 상황</title><link>https://shinkeonkim.com/posts/2026-05-24-cache-pros/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/2026-05-24-cache-pros/</guid><description>캐시 적용이 적절한 상황에 대해</description><pubDate>Sun, 24 May 2026 09:26:00 GMT</pubDate><content:encoded>&lt;p&gt;다음과 같은 조건이라면 캐시를 적용해보자&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;원본 데이터 저장소에서 원하는 데이터를 찾기 위해 검색하는 시간이 오래 걸린다.&lt;/li&gt;
&lt;li&gt;원본 데이터 저장소에서 매번 계산을 통해 데이터를 가져와야 한다.&lt;/li&gt;
&lt;li&gt;캐시에서 데이터를 가져오는 것이 원본 데이터 저장소를 통해 요청하는 것보다 빨라야 한다.&lt;/li&gt;
&lt;li&gt;캐시에 저장된(저장할) 데이터가 잘 변하지 않는 데이터다.&lt;/li&gt;
&lt;li&gt;캐시에 저장된 데이터는 자주 검색되는 데이터다.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><author>koa (김신건)</author></item><item><title>마크다운 문법 종합 테스트</title><link>https://shinkeonkim.com/posts/markdown-kitchen-sink/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/markdown-kitchen-sink/</guid><description>Astro + remark 플러그인 조합에서 어떤 마크다운 문법이 동작하는지 정리한 데모 페이지.</description><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;이 글은 새 블로그에서 지원하는 마크다운 문법을 한눈에 확인하기 위한 페이지입니다.&lt;/p&gt;
&lt;h2 id=&quot;1-기본-텍스트-강조&quot;&gt;1. 기본 텍스트 강조&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;굵게&lt;/strong&gt; · &lt;em&gt;기울임&lt;/em&gt; · &lt;em&gt;&lt;strong&gt;굵게+기울임&lt;/strong&gt;&lt;/em&gt; · &lt;del&gt;취소선&lt;/del&gt; · &lt;code&gt;인라인 코드&lt;/code&gt; · &lt;u&gt;밑줄(HTML)&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;자동 링크: &lt;a href=&quot;https://astro.build&quot;&gt;https://astro.build&lt;/a&gt;
일반 링크: &lt;a href=&quot;https://docs.astro.build&quot;&gt;Astro 공식 문서&lt;/a&gt;
위키 링크: [[Astro]] · 별칭 [[Astro|Astro JS]] · 깨진 링크 [[존재하지않는위키]]&lt;/p&gt;
&lt;h2 id=&quot;2-헤딩-계층&quot;&gt;2. 헤딩 계층&lt;/h2&gt;
&lt;h3 id=&quot;3단계-헤딩&quot;&gt;3단계 헤딩&lt;/h3&gt;
&lt;h4 id=&quot;4단계-헤딩&quot;&gt;4단계 헤딩&lt;/h4&gt;
&lt;h5 id=&quot;5단계-헤딩&quot;&gt;5단계 헤딩&lt;/h5&gt;
&lt;h6 id=&quot;6단계-헤딩&quot;&gt;6단계 헤딩&lt;/h6&gt;
&lt;h2 id=&quot;3-인용과-콜아웃&quot;&gt;3. 인용과 콜아웃&lt;/h2&gt;
&lt;p&gt;평범한 블록 인용:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“단순함이 궁극의 정교함이다.” — 레오나르도 다 빈치&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;GitHub 스타일 콜아웃 (5종):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
정보 — 가볍게 알아두면 좋은 부가 설명을 적습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
팁 — 더 쉽게 일을 처리하기 위한 조언입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
중요 — 목표 달성에 꼭 필요한 핵심 정보입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
경고 — 문제를 피하기 위해 즉시 주의해야 할 내용입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
주의 — 특정 행동으로 인한 위험이나 부정적 결과를 알립니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;4-리스트&quot;&gt;4. 리스트&lt;/h2&gt;
&lt;p&gt;순서 없는 리스트:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;첫 번째 항목&lt;/li&gt;
&lt;li&gt;두 번째 항목
&lt;ul&gt;
&lt;li&gt;중첩 항목&lt;/li&gt;
&lt;li&gt;다른 중첩
&lt;ul&gt;
&lt;li&gt;더 깊은 중첩&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;세 번째 항목&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;순서 있는 리스트:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;패키지 설치&lt;/li&gt;
&lt;li&gt;설정 추가&lt;/li&gt;
&lt;li&gt;빌드 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;체크리스트 (GFM):&lt;/p&gt;
&lt;ul class=&quot;contains-task-list&quot;&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; checked disabled&gt; Astro 프로젝트 셋업&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; checked disabled&gt; BrainDB 대체 remark 플러그인 작성&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; checked disabled&gt; 다크/라이트 모드 구현&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; 1만 글 마이그레이션&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;5-코드-블록&quot;&gt;5. 코드 블록&lt;/h2&gt;
&lt;p&gt;인라인 코드: &lt;code&gt;const greeting = &quot;안녕&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;TypeScript:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;interface&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; User&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  email&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; getUser&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;User&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`/api/users/${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;response.ok) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; response.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;User&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Python:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; dataclasses &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; dataclass&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; typing &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Optional&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;@dataclass&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; User&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;str&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    name: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;str&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    email: Optional[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; None&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; get_user&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(id: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) -&gt; Optional[User]:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    async&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; with&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; httpx.AsyncClient() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; client:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        r &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; client.get(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;/api/users/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;{id}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; r.status_code &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 200&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; None&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        data &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; r.json()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; User(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;data)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bash:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -euo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pipefail&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; file &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; src/content/posts/*.md&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  echo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Processing &lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$file&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  pnpm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; exec&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; markdownlint&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$file&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;done&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;JSON + diff + plain text:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;shinkeonkim-log&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;version&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;0.1.0&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;diff&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FDAEB7&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;-&lt;/span&gt; 안녕하세요&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt; 안녕하세요, 김신건입니다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;순수 텍스트 블록은 하이라이팅이 없습니다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;어떤 언어인지 명시하지 않으면 이렇게 보입니다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;6-표&quot;&gt;6. 표&lt;/h2&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;항목&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;th align=&quot;center&quot;&gt;상태&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;다크/라이트 모드&lt;/td&gt;&lt;td&gt;localStorage + prefers-color-scheme&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;위키링크&lt;/td&gt;&lt;td&gt;자체 remark 플러그인&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;그래프 뷰&lt;/td&gt;&lt;td&gt;D3 force simulation&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;통합 검색&lt;/td&gt;&lt;td&gt;Pagefind 빌드 후 인덱싱&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;페이지네이션&lt;/td&gt;&lt;td&gt;Astro &lt;code&gt;paginate()&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;정렬 옵션:&lt;/p&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;왼쪽 정렬&lt;/th&gt;&lt;th align=&quot;center&quot;&gt;가운데 정렬&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;오른쪽 정렬&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;left&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;center&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;right&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;짧은 텍스트&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;중간 길이 텍스트&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;더 긴 텍스트&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;7-이미지&quot;&gt;7. 이미지&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;public/&lt;/code&gt; 디렉토리에 둔 이미지 (절대 경로):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://shinkeonkim.com/icon-192.png&quot; alt=&quot;사이트 아바타 (public/icon-192.png)&quot;&gt;&lt;/p&gt;
&lt;p&gt;리모트 이미지:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://astro.build/press/astro-logo-light.svg&quot; alt=&quot;Astro 로고&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;8-푸트노트&quot;&gt;8. 푸트노트&lt;/h2&gt;
&lt;p&gt;푸트노트도 지원합니다&lt;sup&gt;&lt;a href=&quot;#user-content-fn-astro-note&quot; id=&quot;user-content-fnref-astro-note&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. 본문이 길어질 때 출처를 정리할 때 유용합니다&lt;sup&gt;&lt;a href=&quot;#user-content-fn-korean&quot; id=&quot;user-content-fnref-korean&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;h2 id=&quot;9-구분선과-줄바꿈&quot;&gt;9. 구분선과 줄바꿈&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;위는 구분선입니다. 줄바꿈 두 칸으로&lt;br&gt;
강제 줄바꿈도 됩니다.&lt;/p&gt;
&lt;h2 id=&quot;10-html-직접-삽입&quot;&gt;10. HTML 직접 삽입&lt;/h2&gt;
&lt;p&gt;마크다운 안에서 필요할 때 HTML 을 직접 쓸 수 있습니다:&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;접었다 펼치는 영역&lt;/summary&gt;
&lt;p&gt;이 안에 마크다운은 동작하지 않습니다 (raw HTML). 그래도 텍스트와 일반 HTML 은 잘 들어갑니다.&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;kbd&gt;⌘&lt;/kbd&gt; + &lt;kbd&gt;K&lt;/kbd&gt; 같은 단축키 표기도 가능합니다.&lt;/p&gt;
&lt;h2 id=&quot;11-코드--실행-결과-패널-codewithoutput&quot;&gt;11. 코드 + 실행 결과 패널 (&lt;code&gt;&amp;#x3C;CodeWithOutput&gt;&lt;/code&gt;)&lt;/h2&gt;
&lt;p&gt;좌측에 입력 코드, 우측에 그 결과를 나란히 보여주는 컴포넌트. 화면이 좁아지면 자동으로 위아래로 쌓입니다 (lg breakpoint 기준). 실제로 실행하는 게 아니라 글쓴이가 결과를 직접 적어 둡니다 — 그래서 셸, REPL, DB CLI, HTTP API 등 &lt;strong&gt;어떤 환경의 입출력이든&lt;/strong&gt; 그대로 옮길 수 있습니다.&lt;/p&gt;
&lt;h3 id=&quot;111-bash&quot;&gt;11.1 Bash&lt;/h3&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;h3 id=&quot;112-redis-cli&quot;&gt;11.2 Redis CLI&lt;/h3&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;h3 id=&quot;113-postgresql-psql&quot;&gt;11.3 PostgreSQL (psql)&lt;/h3&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;h3 id=&quot;114-http--curl--json-응답&quot;&gt;11.4 HTTP — curl + JSON 응답&lt;/h3&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;h3 id=&quot;115-python-repl&quot;&gt;11.5 Python REPL&lt;/h3&gt;
&lt;p&gt;&amp;#x3C;CodeWithOutput
language=“python”
label=“python”
outputLanguage=“text”
outputLabel=”&gt;&gt;&gt;”
title=“dataclass 한 입”
code={`from dataclasses import dataclass&lt;/p&gt;
&lt;p&gt;@dataclass
class Note:
id: str
body: str&lt;/p&gt;
&lt;p&gt;n = Note(id=“2026-05-23”, body=“hello”)
print(n)
print(n.body.upper())&lt;code&gt;}   output={&lt;/code&gt;Note(id=‘2026-05-23’, body=‘hello’)
HELLO`}
/&gt;&lt;/p&gt;
&lt;h3 id=&quot;116-멀티-언어-탭--같은-출력-여러-구현&quot;&gt;11.6 멀티 언어 탭 — 같은 출력, 여러 구현&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;variants&lt;/code&gt; prop 에 언어별 구현을 나열하면 좌측에 탭으로 묶이고, 우측 결과는 공유됩니다. “같은 문제를 어떤 언어로도 풀 수 있다” 를 보여줄 때 유용합니다.&lt;/p&gt;
&lt;p&gt;&amp;#x3C;CodeWithOutput
outputLanguage=“text”
outputLabel=“stdout”
title=“피보나치 첫 10개”
variants={[
{
label: ‘python’,
language: ‘python’,
code: `def fib(n):
a, b = 0, 1
out = []
for _ in range(n):
out.append(a)
a, b = b, a + b
return out&lt;/p&gt;
&lt;p&gt;print(fib(10))&lt;code&gt;,     },     {       label: &apos;typescript&apos;,       language: &apos;ts&apos;,       code: &lt;/code&gt;function fib(n: number): number[] {
const out: number[] = [];
let [a, b] = [0, 1];
for (let i = 0; i &amp;#x3C; n; i++) {
out.push(a);
[a, b] = [b, a + b];
}
return out;
}&lt;/p&gt;
&lt;p&gt;console.log(fib(10));&lt;code&gt;,     },     {       label: &apos;rust&apos;,       language: &apos;rust&apos;,       code: &lt;/code&gt;fn fib(n: usize) -&gt; Vec&lt;u64&gt; {
let mut out = Vec::with_capacity(n);
let (mut a, mut b) = (0u64, 1u64);
for _ in 0..n {
out.push(a);
let next = a + b;
a = b;
b = next;
}
out
}&lt;/u64&gt;&lt;/p&gt;
&lt;p&gt;fn main() {
println!(”{:?}”, fib(10));
}&lt;code&gt;,     },     {       label: &apos;go&apos;,       language: &apos;go&apos;,       code: &lt;/code&gt;package main&lt;/p&gt;
&lt;p&gt;import “fmt”&lt;/p&gt;
&lt;p&gt;func fib(n int) []int {
out := make([]int, 0, n)
a, b := 0, 1
for i := 0; i &amp;#x3C; n; i++ {
out = append(out, a)
a, b = b, a+b
}
return out
}&lt;/p&gt;
&lt;p&gt;func main() {
fmt.Println(fib(10))
}&lt;code&gt;,     },   ]}   output={&lt;/code&gt;[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]`}
/&gt;&lt;/p&gt;
&lt;h3 id=&quot;117-너비-조절&quot;&gt;11.7 너비 조절&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;codeWidth&lt;/code&gt; prop 으로 좌측 코드 패널 너비(%)를 정합니다. 사용자는 가운데 핸들을 &lt;strong&gt;드래그&lt;/strong&gt; (또는 화살표 키) 로 임의 조정할 수 있고, 너비가 100% 가 되면 자동으로 상하 배치로 전환됩니다. 조정값은 컴포넌트 단위로 localStorage 에 저장됩니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;더블클릭 / Enter: 50% 로 리셋&lt;/li&gt;
&lt;li&gt;화살표 키: 2% 씩 (Shift+화살표: 10%)&lt;/li&gt;
&lt;li&gt;End 키: 100% (상하 배치)&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- mdx-component: CodeWithOutput --&gt;
&lt;p&gt;&amp;#x3C;CodeWithOutput
language=“bash”
label=”$ bash”
outputLanguage=“text”
outputLabel=“stdout”
title=“긴 코드 — 코드 영역 넓게 (codeWidth=75)”
codeWidth={75}
code={&lt;code&gt;# 디스크 사용량 큰 디렉토리 상위 5개 du -h --max-depth=1 . 2&gt;/dev/null \\   | sort -hr \\   | head -6 \\   | awk &apos;NR&gt;1 {printf &quot;%-8s %s\\n&quot;, $1, $2}&apos;&lt;/code&gt;}
output={&lt;code&gt;189M    ./dist 42M     ./node_modules/.bin 12M     ./node_modules/three 8.4M    ./src 2.1M    ./public 1.2M    ./_posts&lt;/code&gt;}
/&gt;&lt;/p&gt;
&lt;h2 id=&quot;12-mermaid-다이어그램&quot;&gt;12. Mermaid 다이어그램&lt;/h2&gt;
&lt;p&gt;```mermaid 코드 블록은 자동으로 &lt;a href=&quot;https://mermaid.js.org&quot;&gt;Mermaid&lt;/a&gt; 다이어그램으로 렌더링됩니다. CDN ESM 으로 lazy import 되므로 이 페이지에서만 ~수백KB 로드되고, 다른 글에는 부담이 없습니다. 다크/라이트 모드 토글 시 자동으로 다시 그려집니다.&lt;/p&gt;
&lt;h3 id=&quot;121-flowchart&quot;&gt;12.1 Flowchart&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    A[글쓴이] --&gt;|마크다운 작성| B(.md / .mdx)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    B --&gt; C{remark 파이프라인}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    C --&gt;|wikilink| D[[Wiki 페이지]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    C --&gt;|callout| E[Alert]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    C --&gt;|mermaid| F[다이어그램]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    D &amp;#x26; E &amp;#x26; F --&gt; G((정적 HTML))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    G --&gt;|Pagefind 인덱싱| H[검색 가능]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;122-sequence--빌드-파이프라인&quot;&gt;12.2 Sequence — 빌드 파이프라인&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Dev as 개발자&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant CI as GitHub Actions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Build as Astro Build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant PF as Pagefind&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Pages as GitHub Pages&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Dev-&gt;&gt;CI: git push main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CI-&gt;&gt;Build: bun install + bun run build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Build-&gt;&gt;Build: remark plugins (wikilink/alert/mermaid)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Build-&gt;&gt;Build: Shiki + Content Layer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Build--&gt;&gt;CI: dist/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CI-&gt;&gt;PF: index dist/**/*.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    PF--&gt;&gt;CI: dist/pagefind/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CI-&gt;&gt;Pages: upload artifact&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Pages--&gt;&gt;Dev: https://shinkeonkim.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;123-state-diagram--사이드-드로어-상태&quot;&gt;12.3 State diagram — 사이드 드로어 상태&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;stateDiagram-v2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    [*] --&gt; Closed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Closed --&gt; Opening: 햄버거 클릭&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Opening --&gt; Open: transition 끝&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Open --&gt; Closing: 백드롭/ESC/링크 클릭&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Closing --&gt; Closed: transition 끝&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Open --&gt; Closed: viewport &gt;= md&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;124-er-diagram&quot;&gt;12.4 ER diagram&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;erDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    POST ||--o{ TAG_LINK : has&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    TAG ||--o{ TAG_LINK : tagged&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    POST {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        string slug PK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        string title&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        date published_at&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    TAG {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        string name PK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    TAG_LINK {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        string post_slug FK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        string tag_name FK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;18-인터랙티브-애니메이션&quot;&gt;18. 인터랙티브 애니메이션&lt;/h2&gt;
&lt;p&gt;본문 중간에 &lt;a href=&quot;https://shinkeonkim.com/_studio/&quot;&gt;스튜디오&lt;/a&gt; 에서 만든 애니메이션을 삽입할 수 있습니다.
전체 카탈로그: &lt;a href=&quot;https://shinkeonkim.com/animations/&quot;&gt;/animations/&lt;/a&gt; · 만들기 가이드: &lt;code&gt;manual-docs/animation-studio-guide.md&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;181-http-요청--응답&quot;&gt;18.1 HTTP 요청 / 응답&lt;/h3&gt;
&lt;p&gt;가장 기본적인 패턴 — Client 가 Server 에 요청, Server 가 응답.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;182-redis-캐시-적중-hit&quot;&gt;18.2 Redis 캐시 적중 (HIT)&lt;/h3&gt;
&lt;p&gt;캐시에 데이터가 있어 빠르게 응답하는 경우. DB 조회가 없어서 ~6ms.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;183-redis-캐시-미스-miss&quot;&gt;18.3 Redis 캐시 미스 (MISS)&lt;/h3&gt;
&lt;p&gt;캐시에 없어서 DB 까지 다녀와야 하고, 이후 캐시도 갱신해야 함. ~72ms.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;184-db-primary-replica-복제&quot;&gt;18.4 DB Primary-Replica 복제&lt;/h3&gt;
&lt;p&gt;쓰기는 Primary 에만, Read replica 들에는 WAL 스트림으로 비동기 복제.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;185-load-balancer-round-robin&quot;&gt;18.5 Load Balancer Round-Robin&lt;/h3&gt;
&lt;p&gt;요청들을 서버 풀에 순회하며 분산.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;186-tcp-3-way-handshake&quot;&gt;18.6 TCP 3-way Handshake&lt;/h3&gt;
&lt;p&gt;SYN → SYN+ACK → ACK 로 연결 수립 (각 노드의 상태 전이 함께 표시).&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;187-oauth-20-authorization-code-flow&quot;&gt;18.7 OAuth 2.0 Authorization Code Flow&lt;/h3&gt;
&lt;p&gt;User → App → Auth Server → token → API. 표준 OAuth 시퀀스.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-astro-note&quot;&gt;
&lt;p&gt;Astro 5의 기본 remark 설정은 &lt;code&gt;remark-gfm&lt;/code&gt; 과 &lt;code&gt;remark-smartypants&lt;/code&gt; 를 포함합니다. &lt;a href=&quot;#user-content-fnref-astro-note&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-korean&quot;&gt;
&lt;p&gt;한국어 콘텐츠에서도 푸트노트 마커가 정상 동작합니다. &lt;a href=&quot;#user-content-fnref-korean&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded><category>meta</category><category>markdown</category><category>demo</category><author>koa (김신건)</author></item><item><title>1만 개의 글에서도 빠르게: 블로그 빌드 성능 최적화 회고</title><link>https://shinkeonkim.com/posts/scaling-blog-to-10k-posts/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/scaling-blog-to-10k-posts/</guid><description>Astro 블로그가 1만 개 문서를 안전하게 다루기 위해 O(N²) 빌드 병목을 잡고 그래프/검색을 손본 과정과 교훈.</description><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;새 블로그를 막 띄운 다음, 곧바로 한 가지가 신경 쓰였다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;지금은 글이 몇 개뿐이지만, 1만 개로 늘어나면 빌드와 검색이 버틸까?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;오래 운영할 블로그라면 답은 “버텨야 한다” 다. 마침 더미 글을 잔뜩 만들어 빌드를 돌려본 김에, 어떤 함정에 빠졌고 어떻게 빠져나왔는지 기록해 둔다.&lt;/p&gt;
&lt;h2 id=&quot;어쩌다-1만-개를-측정하게-되었나&quot;&gt;어쩌다 1만 개를 측정하게 되었나&lt;/h2&gt;
&lt;p&gt;새 [[Astro]] 블로그에 다음 기능을 차례대로 붙였다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;마크다운 + 위키링크 + 백링크&lt;/li&gt;
&lt;li&gt;D3 기반 [[D3|지식 그래프]]&lt;/li&gt;
&lt;li&gt;다크/라이트 모드&lt;/li&gt;
&lt;li&gt;[[Pagefind]] 통합 검색&lt;/li&gt;
&lt;li&gt;&lt;code&gt;paginate()&lt;/code&gt; 로 글/노트/위키 페이지네이션&lt;/li&gt;
&lt;li&gt;&lt;code&gt;react-force-graph-3d&lt;/code&gt; 로 3D 그래프 뷰&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;여기까지는 글이 두세 개뿐이라 모든 게 즉시 끝났다. 그래도 1만 개 시나리오에서 어떻게 되는지 보기 위해 10,000 개의 더미 마크다운을 생성하고 &lt;code&gt;pnpm build&lt;/code&gt; 를 돌렸다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
빌드가 &lt;strong&gt;돌아오지 않았다&lt;/strong&gt;. 몇 분이 지나도 끝날 기미가 안 보였다. 강제로 종료.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;여기서 “그래도 1만 개면 좀 오래 걸리겠지” 하고 그냥 기다리는 건 위험하다. 정상적으로 끝날 수 없는 코드일 가능성이 더 크기 때문이다.&lt;/p&gt;
&lt;h2 id=&quot;진단-무엇이-폭주했는가&quot;&gt;진단: 무엇이 폭주했는가&lt;/h2&gt;
&lt;p&gt;빌드 단계별 로그를 보니 각 글 페이지를 그릴 때마다 몇십 ms씩 추가로 시간이 늘어났다. 진짜 범인은 &lt;code&gt;Backlinks.astro&lt;/code&gt; 였다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;astro&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;slug&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;collection&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Astro.props;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; candidates&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [slug, slug.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toLowerCase&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; col&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;posts&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;notes&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;wiki&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; entries&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; getCollection&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(col);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; entry&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; entries) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; body&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; entry.body &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; re&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color:#85E89D;font-weight:bold&quot;&gt;\[\[&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;^&lt;/span&gt;&lt;span style=&quot;color:#85E89D;font-weight:bold&quot;&gt;\]&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;|#]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;)(?:#&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;^&lt;/span&gt;&lt;span style=&quot;color:#85E89D;font-weight:bold&quot;&gt;\]&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;|]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;(?:&lt;/span&gt;&lt;span style=&quot;color:#85E89D;font-weight:bold&quot;&gt;\|&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;^&lt;/span&gt;&lt;span style=&quot;color:#85E89D;font-weight:bold&quot;&gt;\]&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#85E89D;font-weight:bold&quot;&gt;\]\]&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;g&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; m;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ((m &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; re.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;exec&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(body)) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; target&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; m[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;trim&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (candidates.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;includes&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(target) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; candidates.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;includes&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(target.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toLowerCase&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;())) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        matches.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 컴포넌트는 &lt;strong&gt;글 페이지 한 장을 그릴 때마다&lt;/strong&gt; 모든 컬렉션의 모든 본문을 정규식으로 스캔한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;한 페이지당 비용: O(N × 평균 본문 길이)&lt;/li&gt;
&lt;li&gt;페이지 수: N&lt;/li&gt;
&lt;li&gt;전체 비용: &lt;strong&gt;O(N²)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1만 글, 평균 본문 500자라면 어림 잡아 &lt;em&gt;50억 회의 정규식 매칭&lt;/em&gt;. JS 정규식이 초당 1억 문자를 처리한다고 가정하면 50초가 아니라, 매 페이지가 그 비용을 통째로 다시 치르므로 누적되어 &lt;strong&gt;수십 분에서 시간 단위&lt;/strong&gt;까지 늘어난다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
빌드 타임에 O(N²) 가 들어와 있으면 N 이 두 자리 수일 때까지는 &lt;strong&gt;눈에 보이지 않는다&lt;/strong&gt;. 100 → 1만으로 N 이 100배 커지면 작업은 1만 배가 된다. 처음부터 빌드 시점 비용은 페이지당이 아니라 &lt;em&gt;프로젝트당&lt;/em&gt; 으로 가져가는 편이 안전하다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;설계-콘텐츠-그래프를-한-번만-만든다&quot;&gt;설계: 콘텐츠 그래프를 한 번만 만든다&lt;/h2&gt;
&lt;p&gt;해결 방향은 단순했다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;전체 컬렉션을 &lt;strong&gt;딱 한 번&lt;/strong&gt; 순회하면서 &lt;code&gt;{nodes, links, backlinks, slugMap}&lt;/code&gt; 인덱스를 만든다.&lt;/li&gt;
&lt;li&gt;그 인덱스를 모듈 레벨 &lt;code&gt;Promise&lt;/code&gt; 에 캐시한다 — 모든 페이지 렌더가 같은 인덱스를 본다.&lt;/li&gt;
&lt;li&gt;백링크는 Map 조회 한 번으로 끝낸다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// src/lib/content-graph.ts (요약)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cache&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ContentGraph&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt; &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; getContentGraph&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ContentGraph&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;cache) cache &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cache;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ContentGraph&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;posts&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;notes&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wiki&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;all&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;([&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    getCollection&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;posts&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, ({ &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;data.draft),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    getCollection&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;notes&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    getCollection&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;wiki&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; slugMap&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Map&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ContentNode&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; backlinks&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Map&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ContentNode&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[]&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; entry&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;posts, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;wiki, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;notes]) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    /* 모든 별칭/제목/슬러그 → 노드 매핑 추가 */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; entry&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;posts, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;wiki, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;notes]) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    /* body 한 번 스캔, 위키링크 → backlinks 에 누적 */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { nodes, links, backlinks, slugMap };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그리고 백링크 컴포넌트는 이렇게 단순해진다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;astro&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;slug&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;collection&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Astro.props;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; graph&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; getContentGraph&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; matches&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; graph.backlinks.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;canonicalId&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(collection, slug)) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;복잡도가 &lt;strong&gt;O(N²)&lt;/strong&gt; 에서 &lt;strong&gt;O(N) + O(1) 조회 × N 페이지 = O(N)&lt;/strong&gt; 으로 떨어졌다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
Astro 의 페이지 컴포넌트는 모듈처럼 평가된다. &lt;code&gt;Astro:content&lt;/code&gt; 의 &lt;code&gt;getCollection&lt;/code&gt; 호출 결과도 동일 빌드 내에서는 캐시되지만, &lt;strong&gt;거기서 파생된 계산은 따로 캐시되지 않는다&lt;/strong&gt;. 위처럼 직접 만든 인덱스를 모듈 변수에 담아두면 자연스러운 메모이제이션이 된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;그래프-페이지에도-같은-함정이-있다&quot;&gt;그래프 페이지에도 같은 함정이 있다&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;src/pages/graph.astro&lt;/code&gt; 도 비슷한 스캔을 하지만 그쪽은 &lt;em&gt;한 번만&lt;/em&gt; 렌더링되는 페이지라 O(N) 으로 끝났다. 다만 &lt;em&gt;클라이언트에서&lt;/em&gt; 1만 노드를 D3 force simulation 으로 돌리면 브라우저가 사실상 멈춘다. 빌드는 살아도 사용자 경험이 죽는다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;MAX_GRAPH_NODES = 400&lt;/code&gt; 상한을 두고, 초과 시 연결도(degree) 상위 N 개만 그리며 안내한다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; degree&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Map&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; link&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; graph.links) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  degree.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(link.source, (degree.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(link.source) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  degree.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(link.target, (degree.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(link.target) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; truncated&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; graph.nodes.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; MAX_GRAPH_NODES&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; sortedNodes&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; truncated&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  ?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;graph.nodes]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      .&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sort&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;b&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (degree.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(b.id) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (degree.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a.id) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      .&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;slice&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;MAX_GRAPH_NODES&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  :&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; graph.nodes;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;연결이 많은 허브 노드부터 보여주는 편이 첫 인상에서 더 의미 있다. 작은 위성 노드들은 그래프에서 어차피 정보량이 적다.&lt;/p&gt;
&lt;h2 id=&quot;측정-10531-페이지--3457-초&quot;&gt;측정: 10,531 페이지 / 34.57 초&lt;/h2&gt;
&lt;p&gt;수정 후 같은 시나리오로 다시 빌드.&lt;/p&gt;

















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;지표&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;값&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;빌드된 페이지 수&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;10,531&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;전체 빌드 시간&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;34.57s&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;정적 페이지 생성 단계&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;14.31s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pagefind 인덱싱&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;~10s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;dist/&lt;/code&gt; 총 크기&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;189 MB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pagefind 인덱스 크기&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;42 MB (페이지당 ~4.2 KB)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pagefind 검색 (일반 쿼리)&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&amp;#x3C; 100 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pagefind 검색 (10K 매치 쿼리)&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;~1.2 s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;그래프 페이지 SSR&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&amp;#x3C; 50 ms (400 노드 상한)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;페이지네이션 페이지 응답&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&amp;#x3C; 10 ms&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;“무한정 → 35 초” 변화의 거의 전부가 &lt;strong&gt;백링크 인덱스를 모듈 캐시로 옮긴 것&lt;/strong&gt; 에서 왔다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
검색 응답이 가끔 1 초가 넘는 케이스는 &lt;em&gt;“성능”&lt;/em&gt; 처럼 더미 글 1만 개에 거의 모두 들어 있는 단어를 검색했을 때다. 1만 개 결과를 점수 매기느라 시간이 든다. 실제 운영에서는 한 쿼리가 1만 개 결과를 반환하는 일이 거의 없으므로 무시 가능한 코너 케이스.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;같이-손본-자잘한-것들&quot;&gt;같이 손본 자잘한 것들&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pagefind 메타데이터&lt;/strong&gt;: 본문에만 인덱스가 잡히도록 &lt;code&gt;data-pagefind-body&lt;/code&gt; 를 글/위키/노트 컨테이너에만 붙이고, 헤더·푸터·페이지네이션·홈·소개·그래프 페이지에는 &lt;code&gt;data-pagefind-ignore=&quot;all&quot;&lt;/code&gt; 을 달았다. 검색이 더 정확해지고 인덱스 크기도 줄었다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Section 필터&lt;/strong&gt;: &lt;code&gt;data-pagefind-filter=&quot;section:posts/notes/wiki&quot;&lt;/code&gt; 로 검색 UI에서 컬렉션별 필터를 쉽게 제공.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3D 그래프 lazy import&lt;/strong&gt;: &lt;code&gt;react-force-graph-3d&lt;/code&gt; 와 &lt;code&gt;three&lt;/code&gt; 는 무겁다. 2D 가 기본이고, 3D 토글을 누른 순간에만 &lt;code&gt;React.lazy()&lt;/code&gt; 로 코드를 가져온다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub 스타일 콜아웃&lt;/strong&gt;: &lt;code&gt;&gt; [!NOTE]&lt;/code&gt; &lt;code&gt;&gt; [!TIP]&lt;/code&gt; &lt;code&gt;&gt; [!IMPORTANT]&lt;/code&gt; &lt;code&gt;&gt; [!WARNING]&lt;/code&gt; &lt;code&gt;&gt; [!CAUTION]&lt;/code&gt; 5종 — 지금 이 글에 시연되어 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shiki dual-theme&lt;/strong&gt;: 같은 코드 블록이 &lt;code&gt;github-light&lt;/code&gt; 와 &lt;code&gt;github-dark&lt;/code&gt; 모두로 토큰화되고, CSS 변수로 테마를 갈아끼우니 다크 모드 토글이 코드 색까지 자연스럽게 따라온다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;얻은-교훈&quot;&gt;얻은 교훈&lt;/h2&gt;
&lt;h3 id=&quot;1-빌드-시점-비용은-프로젝트-단위-로-묶는다&quot;&gt;1. 빌드 시점 비용은 &lt;em&gt;프로젝트 단위&lt;/em&gt; 로 묶는다&lt;/h3&gt;
&lt;p&gt;페이지 컴포넌트 안에서 “전체 콘텐츠를 한 번 훑는” 코드가 보이면, 그건 거의 항상 잘못 둔 자리다. 그 페이지가 K 개 렌더되면 K 번 훑게 된다. 같은 일이라면 &lt;strong&gt;빌드당 한 번만&lt;/strong&gt; 끝내고 결과를 공유해야 한다.&lt;/p&gt;
&lt;h3 id=&quot;2-모듈-레벨-promise-는-단순하지만-강력하다&quot;&gt;2. 모듈 레벨 &lt;code&gt;Promise&lt;/code&gt; 는 단순하지만 강력하다&lt;/h3&gt;
&lt;p&gt;복잡한 빌드 캐시 인프라 없이도 됐다. ESM 모듈은 한 빌드 안에서 한 번만 평가되므로, 다음 한 줄이면 메모이제이션이 끝난다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cache&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;X&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt; &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;cache) cache &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cache;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;추상화 단계가 적을수록 디버깅이 쉽다. [[BrainDB]] 같은 외부 도구를 쓸 수 없었던 게 오히려 단순한 해법으로 이끌었다.&lt;/p&gt;
&lt;h3 id=&quot;3-작은-n-으로-측정하면-함정을-못-본다&quot;&gt;3. 작은 N 으로 측정하면 &lt;strong&gt;함정을 못 본다&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;글 5 개일 때는 백링크 컴포넌트가 25 회 스캔을 했다. 눈에 띄지도 않는다. 안전하게 가려면 &lt;em&gt;의도적으로 큰 N&lt;/em&gt; 을 만들어 한 번쯤 돌려봐야 한다. 더미 글 생성 스크립트는 30 줄 정도면 충분하다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// scripts/generate-dummy-posts.mjs (요약)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; COUNT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; rand&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; rng&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  fs.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;writeFileSync&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    path.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;OUT_DIR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`stress-${&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;padStart&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;0&apos;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}.md`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    `---&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;title: &quot;${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;date: ${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;date&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;---&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n\n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 한 번의 부하 테스트가 운영 단계에서의 미래의 한 시간짜리 장애를 사전에 막아 준다.&lt;/p&gt;
&lt;h3 id=&quot;4-빌드를-살려도-런타임이-살아야-한다&quot;&gt;4. 빌드를 살려도, 런타임이 살아야 한다&lt;/h3&gt;
&lt;p&gt;이번에는 그래프 페이지가 좋은 예시였다. 빌드 자체는 1만 노드를 무리 없이 직렬화하지만, 그 데이터를 받은 브라우저는 D3 force tick 첫 번째 프레임에서 죽는다. &lt;strong&gt;빌드 결과를 소비하는 쪽&lt;/strong&gt; 의 한계도 같이 봐야 한다.&lt;/p&gt;
&lt;h3 id=&quot;5-검색은-pagefind-가-그냥-동작-한다&quot;&gt;5. 검색은 Pagefind 가 “그냥 동작” 한다&lt;/h3&gt;
&lt;p&gt;Pagefind 는 빌드된 HTML 을 후처리로 인덱싱한다. 1만 페이지에 대해서도 인덱스가 42 MB, 클라이언트는 청크 단위로만 받아오므로 초기 로드도 가볍다. 한국어 토크나이징도 별도 설정 없이 &lt;code&gt;&amp;#x3C;html lang=&quot;ko&quot;&gt;&lt;/code&gt; 만으로 잘 동작했다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
Pagefind 인덱스는 빌드된 HTML 을 읽기 때문에 &lt;em&gt;HTML 에 보이지 않는 내용은 검색되지 않는다&lt;/em&gt;. 백링크 같은 동적 영역이 SSR 단계에서 잘 렌더되어 있는지 확인하는 게 중요하다. 클라이언트 hydration 으로 채워지는 영역은 검색에 빠진다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;마무리&quot;&gt;마무리&lt;/h2&gt;
&lt;p&gt;이번 라운드의 변화는 결국 한 가지 룰로 요약된다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;빌드 시점에 전체를 훑는 일은, 빌드당 한 번만 한다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이 규칙 하나가 1만 페이지 빌드를 &lt;em&gt;못 끝남&lt;/em&gt; 에서 &lt;em&gt;35 초 안에 끝남&lt;/em&gt; 으로 바꿨다. 같은 규칙이 위키링크 인덱스(&lt;a href=&quot;https://github.com/shinkeonkim/shinkeonkim.github.io/blob/main/src/plugins/remark-wikilink.mjs&quot;&gt;&lt;code&gt;remark-wikilink.mjs&lt;/code&gt;&lt;/a&gt;)에도, 그래프 데이터(&lt;a href=&quot;https://github.com/shinkeonkim/shinkeonkim.github.io/blob/main/src/lib/content-graph.ts&quot;&gt;&lt;code&gt;content-graph.ts&lt;/code&gt;&lt;/a&gt;)에도, 태그 인덱스에도 적용된다.&lt;/p&gt;
&lt;p&gt;앞으로 콘텐츠가 늘어나면서 새로운 병목이 또 보이겠지만, 이번 회고로 일단 만 단위까지는 안심하고 글을 쌓을 수 있게 됐다. 늘 그렇듯 — &lt;strong&gt;일단 기록을 하자&lt;/strong&gt;.&lt;/p&gt;</content:encoded><category>perf</category><category>build</category><category>astro</category><category>optimization</category><category>retrospective</category><author>koa (김신건)</author></item><item><title>2025년 회고록 - 개발자에서 학생으로 돌아가서, 2025년을 정리하며</title><link>https://shinkeonkim.com/posts/my-life/2025-12-31-goodbye-2025/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/my-life/2025-12-31-goodbye-2025/</guid><pubDate>Wed, 31 Dec 2025 04:30:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;개요&quot;&gt;개요&lt;/h2&gt;
&lt;p&gt;2025년… 굉장히 많은 일이 있었던 것 같습니다.&lt;/p&gt;
&lt;p&gt;퇴사부터, 대학교 복학, &lt;code&gt;멋쟁이사자처럼&lt;/code&gt;과 &lt;code&gt;SIPE&lt;/code&gt; 동아리 활동 그리고 &lt;code&gt;여러 프로젝트&lt;/code&gt;와 &lt;code&gt;자격증 취득&lt;/code&gt;까지 정말 다양한 활동을 했습니다.&lt;/p&gt;
&lt;p&gt;이전에도 써왔던 회고글들처럼, 2025년 한 해 동안 있었던 일들을 회고하고자 합니다.
다만 여러 종류의 일들이 있었던지라, 카테고리별로 정리해보려 합니다.&lt;/p&gt;
&lt;h2 id=&quot;1-퇴사와-복학&quot;&gt;1. 퇴사와 복학&lt;/h2&gt;
&lt;p&gt;올해 3월에 퇴사와, 대학교 복학을 같이 했습니다. &lt;a href=&quot;https://shinkeonkim.com/posts/grepp-memoir/&quot;&gt;이전 글&lt;/a&gt; 에서 퇴사에 대한 이야기를 다루기도 했습니다.&lt;/p&gt;
&lt;p&gt;퇴사를 하고 나서도 뭘 해야 할지 여러 고민을 했습니다. &lt;code&gt;어떤 도전들을 해야 할지&lt;/code&gt;, &lt;code&gt;어떤 공부들을 해야 할지&lt;/code&gt;에 대해서. 그래서 여러 도전적인 활동을 해보려고 했고, 더 다양한 분야의 공부도 해보려고 했습니다.&lt;/p&gt;
&lt;h2 id=&quot;2-동아리-활동&quot;&gt;2. 동아리 활동&lt;/h2&gt;
&lt;h3 id=&quot;21-멋쟁이사자처럼-국민대학교-운영진&quot;&gt;2.1. 멋쟁이사자처럼 국민대학교 운영진&lt;/h3&gt;
&lt;p&gt;멋쟁이사자처럼 국민대학교 동아리에서 백엔드 파트장을 맡아 1년간 활동했습니다. 그리고 올해를 마지막으로 더 이상 멋쟁이사자처럼 동아리에서 활동은 하지 않기로 했습니다.&lt;/p&gt;
&lt;p&gt;생각해 보면, 멋쟁이사자처럼 국민대학교 동아리와의 인연이 제 커리어패스에 많은 영향을 주었던 것 같습니다.&lt;/p&gt;
&lt;p&gt;2020년에 멋쟁이사자처럼 국민대학교 동아리에 아기사자로 참여하기 시작했습니다.
그리고 2021년, 2022년, 2024년, 2025년까지 운영진을 맡았습니다.&lt;/p&gt;
&lt;p&gt;아기사자로 들어갔을 때는 처음으로 django 프레임워크를 접했고, 웹 개발에 대한 기초적인 지식을 쌓을 수 있었습니다.
그리고 운영진으로 활동하면서는 여러 사람들에게 저의 지식을 전파하는 경험을 했고, 누군가를 가르쳐야 한다는 생각에 더 많은 지식을 습득하려고 노력하는 과정도 있었습니다.&lt;/p&gt;
&lt;p&gt;올해는 특히나 백엔드 파트장을 맡으면서, django와 drf에 대한 세션 커리큘럼을 구성하고, 직접 세션도 진행했습니다. 거기에 더해 마지막 활동이라고 생각했기 때문에, 프로젝트에 참여도 하고, 프로젝트를 심사하는 경험을 다 해보면서 마무리하고 싶었습니다.&lt;/p&gt;
&lt;p&gt;그래서 대학생 참가자로, 4호선톤이라는 연합 해커톤 대회에도 참여를 했습니다. (비록 수상은 못했지만, 프로젝트 결과물은 괜찮게 나왔습니다.)
또, 교내 해커톤에서는 심사위원으로 프로젝트 심사도 하게 되었습니다.&lt;/p&gt;
&lt;img src=&quot;https://shinkeonkim.com/img/posts/2025/12/31/심사위원.jpeg&quot; alt=&quot;1학기 학점&quot; style=&quot;width:200px&quot;&gt;
&lt;h3 id=&quot;22-sipe-4기&quot;&gt;2.2. SIPE 4기&lt;/h3&gt;
&lt;p&gt;SIPE는 제가 뭘 도전해야 할지 고민하던 시기에 알게 된 동아리입니다.&lt;/p&gt;
&lt;p&gt;SIPE는 다른 개발자 동아리나 스터디 그룹과는 다르게, 개발자들이 모여 경험을 서로 공유하고 네트워킹을 하는 데에 중점을 둔 동아리입니다.&lt;/p&gt;
&lt;p&gt;그래서 제가 고민하던 “새로운 도전과 다양한 경험”에 대해서, 간접적으로 다른 사람들의 경험으로 배울 수 있는 좋은 기회였습니다. 그리고 어쩌면 몇 개의 다리를 거쳐서 알아야 하는 사람들을 바로 알게 되는 좋은 기회이기도 했습니다.&lt;/p&gt;
&lt;p&gt;거기에 더해, SIPE에서는 미션을 수행하는 활동이 있었는데, 그 중 “AI가 나를 소개해줘요” 미션과 “자라나는 새싹 키우기” 미션을 진행했습니다.&lt;/p&gt;
&lt;p&gt;“AI가 나를 소개해줘요” 미션은 제가 AI 기술에 관심을 가지고 있었고, LLM이 마치 나처럼 나를 소개하는 경험을 해보고 싶어서 발제했습니다. 많은 사이퍼들이 관심을 가져주셨고 좋은 결과물을 낼 수 있었습니다. -&gt; &lt;a href=&quot;https://singun11.notion.site/sipe-ai&quot;&gt;관련 페이지&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;“자라나는 새싹 키우기” 미션은 개발자를 꿈꾸는 고등학생들에게 멘토링을 해주는 미션이었습니다. 이전부터 교육에 관심이 많았던 터라, 이 미션도 흥미롭게 참여했습니다. 좀더 다양한 기술을 알려주고 싶었지만, 고등학생들의 수준에 맞추다보니 기본적인 내용 위주로 알려줄 수 밖에 없었던 점이 아쉬웠습니다. 그리고 교육 분야나 기술 전파에 관심을 가지고 있는 상황이니 더욱더 교안이나 장표들을 미리 많이 준비해놓아야겠다는 생각이 들었습니다.&lt;/p&gt;
&lt;p&gt;SIPE 5기에도 참여할까 고민하였지만, 2026년에는 졸업을 앞두고 캡스톤 프로젝트를 진행해야 하고 새로운 직장을 찾는 여정을 시작해야 해서 참여하지 않기로 했습니다. 6기에는 다시 참여할 수도 있을 것 같은데, 어떤 다양한 분들과 네트워킹을 할 수 있을지 기대가 벌써 되면서, 5기에 참여하지 못하는게 아쉽기도 합니다.&lt;/p&gt;
&lt;h2 id=&quot;3-대학교-3학년-생활&quot;&gt;3. 대학교 3학년 생활&lt;/h2&gt;
&lt;p&gt;이번에 대학교 복학 후 공부를 하면서 세상이 많이 바뀌었다고 느꼈습니다. 19학번으로 입학핵서 학교를 다녔던 때는 AI 기술 자체가 발전되어있지 않았고 LLM도 없었으며 무조건 직접 공부하고 찾아보고 암기하는 방식이었습니다.&lt;/p&gt;
&lt;p&gt;하지만 지금은 LLM이 있고, 다양한 AI 서비스와 도구가 있습니다. 그래서 공부하는 방식도 달라져야 한다고 생각했습니다. 제가 공부하는 방식에다가 AI 도구들을 적절히 활용하게 되었고, 이에 대한 공부 결과, 공부 방식에 대해서 정리해 보겠습니다.&lt;/p&gt;
&lt;h3 id=&quot;31-두근두근-나의-학점은&quot;&gt;3.1. 두근두근, 나의 학점은?&lt;/h3&gt;
&lt;p&gt;1학기와 2학기 모두 좋은 학점을 받았습니다.&lt;/p&gt;
&lt;div style=&quot;display:flex; gap:20px;&quot;&gt;
&lt;img src=&quot;https://shinkeonkim.com/img/posts/2025/12/31/1학기_학점.jpeg&quot; alt=&quot;1학기 학점&quot; style=&quot;width:200px&quot;&gt;
&lt;img src=&quot;https://shinkeonkim.com/img/posts/2025/12/31/2학기_학점.png&quot; alt=&quot;2학기 학점&quot; style=&quot;width:250px&quot;&gt;
&lt;/div&gt;
&lt;h3 id=&quot;32-어떻게-공부하고-있는가-그리고-왜-이렇게-공부해야-하는가&quot;&gt;3.2. 어떻게 공부하고 있는가? 그리고 왜 이렇게 공부해야 하는가?&lt;/h3&gt;
&lt;p&gt;우선 굿노트로 강의 내용들을 한 판에 정리했습니다. 저는 공부하는 내용이 제대로 구조화되어 있지 않으면 머릿속에 잘 들어오지 않습니다.&lt;/p&gt;
&lt;p&gt;그래서 일부러 강의 내용을 정리할 때, 계층 구조를 나누거나 서열을 나누는 방식을 적용합니다. 그리고 연관된 개념과 상반된 개념이 한 번에 다 보이도록 합니다.&lt;/p&gt;
&lt;p&gt;이 정리 방식은 시험을 보거나 복습을 할 때도 훨씬 도움이 됩니다. “그 개념이 어디에 있더라?” 혹은 “그건 무슨 개념이랑 연관이 있지?”라는 생각이 들면, 그 개념이 어디에 있었는지를 떠올리면서 쉽게 기억할 수 있기 때문입니다.&lt;/p&gt;
&lt;p&gt;아래 이미지들은 제가 굿노트로 정리했던 내용들 중 일부입니다.&lt;/p&gt;
&lt;p&gt;하나하나가 작은 그림 또는 픽셀처럼 보이지만, 각각 PPT 슬라이드 한 장이거나 강의 필기 내용을 정리한 것들입니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://shinkeonkim.com/img/posts/2025/12/31/%ED%95%84%EA%B8%B0-%EC%A0%95%EB%A6%AC-%EC%9D%BC%EB%B6%80.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;그러면 끝일까요? 아닙니다.&lt;/p&gt;
&lt;p&gt;위의 방식은 한 번씩 개념을 정리한 것뿐이고 아직 제 머리에는 다 들어가 있지 않은 상태입니다.&lt;/p&gt;
&lt;p&gt;여기에서 AI 도구 중 하나인 notebooklm을 활용합니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://shinkeonkim.com/img/posts/2025/12/31/notebooklm-ex2.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;notebooklm은 구글에서 제공하는 LLM 기반의 도구입니다. 여기에 제가 정리해 놓은 시험 범위 .md 또는 .txt 파일을 업로드하고, 강의 교안도 같이 업로드합니다.&lt;/p&gt;
&lt;p&gt;그러고 나서 notebooklm에서 제공하는 퀴즈 기능, 플래시카드 기능을 활용해서 무한 반복하며 복습 및 암기합니다. 만약 모르는 내용이 나오거나, 틀린 문제가 나오면, notebooklm에서 자연스럽게 해설 제공 기능을 이용하여 개념을 다시 이해할 수 있도록 했습니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://shinkeonkim.com/img/posts/2025/12/31/notebooklm-ex1.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;이런 방식을 통해서, 머릿속에 구조화된 개념을 넣었고 그 개념을 복습하는 과정까지 거쳤습니다.&lt;/p&gt;
&lt;p&gt;여기서 끝일까요? 만약 특정 강의나 특정 개념이 코드를 작성하는 것과 관련되어 있거나 설계를 해야 하는 것을 공부해야 한다면, notebooklm 만으로는 부족합니다.&lt;/p&gt;
&lt;p&gt;그래서 저는 Claude Code, Cursor, Antigravity와 같이 IDE에서 코딩 에이전트가 동작하는 것을 프로젝트에 적용하는 것과는 또 다른 방식으로 활용해 봤습니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://shinkeonkim.com/img/posts/2025/12/31/code-study-ex.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;위의 이미지에서와 같이 특정 기술의 다양한 예제 혹은 어떤 프로그래밍 언어의 문법에 대한 실습 등을 프롬프트를 통해 구성하도록 했고, 결과물들을 확인하고 다르게 변주해보면서 이해하는 과정을 거쳤습니다.&lt;/p&gt;
&lt;h2 id=&quot;4-일정-관리&quot;&gt;4. 일정 관리&lt;/h2&gt;
&lt;p&gt;올해는 &lt;code&gt;todomate&lt;/code&gt;라는 일정 관리 도구를 활용했습니다. 2026년까지는 그대로 쓰지 않을까 싶습니다만.. 그 이후에는 다른 도구를 쓸 수도 있겠다는 생각이 듭니다.&lt;/p&gt;
&lt;p&gt;아무튼, 올해 2월에 친구의 추천으로 쓰기 시작했던 &lt;code&gt;todomate&lt;/code&gt; 사용은 아주 성공적이었던 것 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://shinkeonkim.com/img/posts/2025/12/31/todomate.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;처음에는 단순히 루틴적으로 해야하는 일들만 관리하려고 사용했습니다. 예를 들어, BOJ 문제 풀이, 운동, 청소 등이요.
하지만 점점 사용하면서 그냥 무작정 떠오르는 일들도 적어두고, 장기적으로 해야하는 일들은 세세하게 쪼개서 적어두는 방식으로 활용하기에는 괜찮았습니다.&lt;/p&gt;
&lt;p&gt;그래서 매일 아침마다 todomate를 켜서 오늘 할 일들을 확인하고, 자기 전에는 오늘 했던 일들을 다시 체크하는 방식으로 활용했습니다.&lt;/p&gt;
&lt;p&gt;다만, 프로젝트 단위로 일을 관리해야 하거나, 팀 단위로 관리해야 하는 일이 있다면 매우 적합하지 않았습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;제가 해야 하는 개인 일정 관리에는 좋았지만 팀 단위의 일을 같은 곳에서 보고 싶어서 중복으로 관리하다 보니 오히려 번거로울 때도 있었습니다.&lt;/li&gt;
&lt;li&gt;프로젝트 단위로 일을 관리하기에는 각 할 일마다의 순서나 의존성 관리를 할 수 없다 보니 계속해서 수작업으로 일의 순서를 조정해야 했습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이 때문에 좀 더 좋은 일정 관리 도구를 찾으면 바로 다른 도구로 바꾸어 사용해 보면서 실험을 해보려고 합니다.&lt;/p&gt;
&lt;p&gt;그래도 이 덕분에 올해는 일정 관리가 꽤 잘 된 한 해였던 것 같습니다. 예를 들어, 백준 스트릭 기록도 12월 31일 기준으로 729일째 이어지게 되었습니다.&lt;/p&gt;
&lt;h2 id=&quot;5-프로젝트&quot;&gt;5. 프로젝트&lt;/h2&gt;
&lt;p&gt;올해는 적당한 수의 프로젝트를 진행했던 것 같습니다. 다만 이 프로젝트들을 동시에 진행했던 적도 있어서 조금은 버거웠던 감도 있었습니다. 내년에는 동시에 최대 2개 정도로, 1개는 큰 볼륨의 프로젝트, 1개는 작은 볼륨의 프로젝트로 진행하는 게 좋을 것 같습니다.&lt;/p&gt;
&lt;h3 id=&quot;51-코드kr&quot;&gt;5.1. &lt;a href=&quot;https://xn--hy1by51c.kr/&quot;&gt;코드.kr&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;코드.kr 이라는 Obsidian 기반의 웹 블로그 프로젝트를 진행했습니다. 만드는 데에는 몇 시간 들지도 않았고, 점차 글들을 추가하면서 발전시켜 나가는 방식으로 진행하고 있습니다.&lt;/p&gt;
&lt;p&gt;먼저 obsidian에서 글을 작성하고, 이 내용을 Github repo에 올립니다. 그리고 자동으로 Cloudflare Pages에서 이 Repo를 빌드하여 정적 웹사이트로 배포하는 방식입니다. 이때 &lt;a href=&quot;https://quartz.jzhao.xyz/&quot;&gt;Obsidian Quartz&lt;/a&gt; 테마를 사용했습니다.&lt;/p&gt;
&lt;p&gt;이후에는 테마를 제 입맛에 맞게 수정하고, 디자인을 바꾸면서 더 꾸며나가려고 합니다. 그리고 글도 꾸준히 올리려고 합니다.&lt;/p&gt;
&lt;h3 id=&quot;52-깜빡이&quot;&gt;5.2. 깜빡이&lt;/h3&gt;
&lt;p&gt;깜빡이 프로젝트는 4호선톤에 참가하여 진행했던 프로젝트입니다.  좋은 팀원들을 만나서, 색다른 아이디어를 접할 수 있었던 경험이었습니다.&lt;/p&gt;
&lt;p&gt;만 5~10세 아동의 집중력 향상을 목표로 하는 아동 교육 서비스이며, 게이미피케이션 요소를 도입하여 아이들이 즐겁게 게임을 하면서도 집중력을 기르고, 그 결과에 대한 리포트를 부모님께 제공하는 서비스입니다.&lt;/p&gt;
&lt;p&gt;저는 인프라 및 백엔드 개발을 담당해서 진행했습니다.&lt;/p&gt;
&lt;p&gt;처음에는 홈랩에 있는 K8s 클러스터를 통해 배포하였지만, 나중에는 AWS로 이전하여 배포했습니다. (개발 과정 중에 한번 홈랩 k8s 클러스터가 돌아가는 미니 PC가 전원이 꺼지는 등의 이슈가 있었고 해커톤 진행 중에 서비스가 다운되면 복구하기가 어렵기 때문에 이런 결정을 했습니다.)&lt;/p&gt;
&lt;p&gt;인프라 구성은 &lt;a href=&quot;https://github.com/kkambbaki/infra&quot;&gt;이곳&lt;/a&gt;에서 다루고 있습니다.&lt;/p&gt;
&lt;p&gt;그리고 백엔드는 django, drf, postgresql, redis, celery를 활용하여 개발했습니다. 제가 굉장히 애용하는 기술 스택이을 거의 그대로 활용했고 개발의 속도를 빠르게 낼 수 있었습니다.&lt;/p&gt;
&lt;p&gt;이 프로젝트를 진행하면서 가장 신경 쓴 점은 PDF 리포트 생성 및 메일 발송 부분이었습니다.&lt;/p&gt;
&lt;p&gt;PDF로 변환해야 하는 리포트 페이지는 프론트엔드에서 구현되어있고, 이 페이지는 사용자 로그인 후 접근해야 하는 페이지였습니다. 그래서 단순히 해당 페이지의 HTML을 가져오거나, URL에 접근하는 방식으로는 PDF를 생성할 수 없었습니다.&lt;/p&gt;
&lt;p&gt;단순하게 제가 떠올린 해결책은 일회용 토큰이었습니다. 백엔드에서 PDF 생성 과정 중에 일회용 토큰을 발급하고 첨부하여 해당 페이지에 접근하게 했습니다. 프론트엔드 로직에서는 해당 토큰을 Header에 담아 백엔드 API에 요청을 보내면 이를 통해 User 인증을 처리했고, 인증이 완료된 상황에서 페이지를 렌더링 하여 PDF로 변환하는 방식을 적용했습니다. (약간 회사에서 경험했던 내용을 간단하게 해커톤 프로젝트에 적용해본 셈이었는데, 나름 잘 동작해서 다행이었습니다.)&lt;/p&gt;
&lt;p&gt;이 과정에서 celery를 활용하여 비동기적으로 PDF 생성 작업을 처리했고, PDF를 첨부하여 메일을 발송했습니다.&lt;/p&gt;
&lt;p&gt;이 프로젝트에 대한 자세한 내용은 &lt;a href=&quot;https://github.com/kkambbaki&quot;&gt;이곳&lt;/a&gt;에서 확인할 수 있습니다.&lt;/p&gt;
&lt;h3 id=&quot;53-athena-프로젝트&quot;&gt;5.3. Athena 프로젝트&lt;/h3&gt;
&lt;p&gt;Athena 프로젝트는 1학기에 수강한 웹서버컴퓨팅 과목의 AD 과제 겸 SIPE 미션에서 AI를 활용하는 프로젝트로 진행했습니다. 저 혼자 프로젝트 설계와 개발을 모두 진행했습니다.&lt;/p&gt;
&lt;p&gt;이 프로젝트는 알고리즘 문제 풀이를 도와주는 AI 기반의 웹 서비스입니다. 백준 온라인 저지 문제를 기반으로 사용자가 코드를 제출하면, 먼저 코드를 실행하고 테스트케이스를 통과하는지 확인합니다. 만약 테스트케이스를 통과하지 못한다면 반례를 찾아냅니다. 반례가 없었다면 AI 모델을 활용하여 코드의 문제점을 분석하고 사용자에게 피드백을 제공합니다.&lt;/p&gt;
&lt;p&gt;사용자는 계속해서 피드백을 적용하면서 코드를 개선할 수 있게 됩니다. 이 과정에서 반례 데이터나 피드백 데이터가 계속 수집되게 되고, 이를 통해 AI 모델이 점점 더 정확한 피드백을 제공할 수 있도록 합니다.&lt;/p&gt;
&lt;p&gt;이 프로젝트에서는 docker-compose와 Docker를 기반으로 로컬에서 동작하는 환경까지만 구축했습니다. 이후에는 k8s 클러스터에서 동작하는 과정으로 확장할 수도 있지만, 마이크로서비스에 대해서 좀 더 경험을 쌓으면서 진행하는 게 좋을 것 같아서 일단은 여기서 마무리했습니다.&lt;/p&gt;
&lt;p&gt;이 프로젝트는 아래와 같이 여러 개의 서비스들로 나누어 구성되어 있습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/shinkeonkim/AD_project_athena&quot;&gt;https://github.com/shinkeonkim/AD_project_athena&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/shinkeonkim/code-judger&quot;&gt;https://github.com/shinkeonkim/code-judger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/shinkeonkim/code-executor&quot;&gt;https://github.com/shinkeonkim/code-executor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/shinkeonkim/code-testcase-generator&quot;&gt;https://github.com/shinkeonkim/code-testcase-generator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;웹앱은 django의 MTV 패턴을 그대로 사용하여 구성했습니다. 코드 실행은 Rust로 작성된 code-executor 서비스에서 처리했습니다. 그리고 이 서비스를 활용하여 코드 채점을 처리하는 code-judger 서비스를 구성했으며, 테스트케이스 생성을 위해 LLM 서비스와 채점 기능을 활용하는 code-testcase-generator 서비스를 구성했습니다. 그리고 이 모든 서비스들은 Docker container로 구성되었고, grpc를 통해 서로 통신하도록 설계했습니다.&lt;/p&gt;
&lt;p&gt;완성도가 높지 않았다고 생각했고 실제로 서비스가 운영되기에는 어려운 점이 있었던 것 같습니다. 그래도 &lt;a href=&quot;https://playzone.kookmin.ac.kr/user/compe/viewAwardContents.do?currentPageNo=&amp;#x26;dataSeq=1010037&amp;#x26;parentSeq=1010037&quot;&gt;국민대학교 2025학년도 1학기 소프트웨어융합대학 크리에이터 경진대회&lt;/a&gt;에서 1등을 수상하는 성과를 거두기도 하면서 나름 의미 있는 프로젝트였던 것 같습니다. 그리고 혼자서 진행한 프로젝트였지만, 여러모로 배운 점도 많았기에 재미있게 진행했던 것 같습니다.&lt;/p&gt;
&lt;h3 id=&quot;54-palette&quot;&gt;5.4. Palette&lt;/h3&gt;
&lt;p&gt;Palette 프로젝트는 사주 기반의 소개팅 서비스입니다. 아직 실제 사용자에게 배포가 되지는 않았습니다.&lt;/p&gt;
&lt;p&gt;이 프로젝트에서는 실제 사용자들의 사주 데이터를 기반으로, 사주 궁합이 좋은 사람에 대해 매칭을 해주는 기능을 제공하고 있고, LLM을 활용하여 사주 궁합을 설명해 주는 기능도 제공합니다.&lt;/p&gt;
&lt;p&gt;PASS 인증이나 토스 페이먼츠 등을 활용해서 인증 및 결제 기능까지 구현해 두었고, k8s 클러스터 배포 및 CI/CD 파이프라인도 구축했습니다. 이후에 실제 사용자가 사용하고 여러 피드백과 이슈를 처리하면서 내용을 정리하여 다시 글을 작성해 보겠습니다.&lt;/p&gt;
&lt;h2 id=&quot;6-자격증&quot;&gt;6. 자격증&lt;/h2&gt;
&lt;p&gt;올해도 마찬가지로 자격증 시험들을 치렀습니다.&lt;/p&gt;
&lt;p&gt;정보처리기사, ADsP, 제한무선통신사, PCCP, 운전면허를 취득했습니다. 그리고 리눅스마스터 필기시험도 통과했지만, 실기 시험은 미루다가 결국 2026년으로 넘어가게 되었습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;정보처리기사 : 미루고 미루다가 무난하게 합격했습니다. 공부 기간이 그렇게 길지는 않았고 전공 개념을 복습하는 느낌으로 공부했습니다.&lt;/li&gt;
&lt;li&gt;ADsP : 데이터 분석에 대한 기초적인 개념들을 공부했습니다. 실제 업무를 진행하는 과정에서 데이터 분석 업무를 진행하시는 분들과 협업하거나 소통할 때 도움이 되지 않을까 싶어서 취득했습니다. 이후에 인공지능 공부나 데이터 용어를 접하면서 도움이 되었습니다.&lt;/li&gt;
&lt;li&gt;제한무선통신사 : 군대에서 무선 통신을 옆에서 지켜보면서 관심을 가지게 되어 취득하게 되었습니다. 단순히 기초 개념 강의를 듣고 간단한 문제 풀이로 취득할 수 있는 자격증이었습니다. 이후에 아마추어무선기사 자격증 쪽으로도 도전해 볼까 생각 중입니다. 취미로도 괜찮을 것 같고, 무선 통신에 대한 이해도를 높이는 데에도 도움이 될 것 같습니다.&lt;/li&gt;
&lt;li&gt;PCCP : 국민대학교 내에서 해당 자격증의 점수가 필요한 경우가 있어서 취득하게 되었습니다. 코딩테스트는 평소에 미리 계속 연습해 오던 터라, Lv4로 무난하게 취득했습니다. 시간 관리를 신경 쓰면서 풀었으면 Lv5도 가능했을 것 같다는 생각이 듭니다.&lt;/li&gt;
&lt;li&gt;운전면허: 너무 오랫동안 미루다가 취득하게 되었습니다. 1종 보통 면허를 취득했고, 클러치 조작이 처음에 너무 어려웠는데, 연습하다 보니 금방 적응했던 것 같습니다. 하지만 자동 차량을 운전할 것 같고.. 장롱면허가 될 것 같기도 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;결론&quot;&gt;결론&lt;/h2&gt;
&lt;p&gt;올해는 많은 사건, 사고가 있었습니다. 그 속에서 다양한 경험을 했고, 많은 사람을 만났습니다. 그리고 개발자로서의 커리어를 쌓다가 학생으로 돌아가서 다시 공부에 전념하기도 했습니다.&lt;/p&gt;
&lt;p&gt;내년에는 진짜 졸업을 앞두고 있습니다. 캡스톤 프로젝트를 진행해야 하고, 새로운 직장을 찾아야 합니다.
그래서 2026년에는 좀 더 집중해서 공부하고, 준비를 해야 할 것 같습니다.&lt;/p&gt;
&lt;p&gt;Java / Spring 공부, Golang, Django와 Rails 근본 파헤치기, 캡스톤 프로젝트 등등. 할 게 많이 떠오릅니다. 어찌 되었든 2026년에도 열심히 달려보려고 합니다.&lt;/p&gt;
&lt;p&gt;모두 좋은 한 해를 보내셨길 바라며, 그리고 2026년에도 좋은 일들만 가득하시길 바랍니다.&lt;/p&gt;
&lt;p&gt;저의 넋두리같은 글을 읽어주셔서 감사합니다!&lt;/p&gt;</content:encoded><category>회고록</category><author>koa (김신건)</author></item><item><title>Atcoder Beginner Contest 399 후기</title><link>https://shinkeonkim.com/posts/atcoder/2025-03-30-abc-399/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/atcoder/2025-03-30-abc-399/</guid><description>2025년 3월 30일에 진행된 Atcoder Beginner Contest 399에서 풀이한 문제들과 풀이 방법, 그리고 대회 경험을 공유하는 후기입니다.</description><pubDate>Sun, 30 Mar 2025 10:00:00 GMT</pubDate><content:encoded>&lt;h1 id=&quot;개요&quot;&gt;개요&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc399&quot;&gt;대회 링크&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;어제 (03/29) 저녁 9시부터 10시 40분까지 진행된 [[Atcoder]] Beginner Contest 399 후기입니다.&lt;/p&gt;
&lt;p&gt;총 7문제 중 4문제를 풀었습니다.&lt;/p&gt;
&lt;p&gt;A번부터 D번까지 풀이하는데 19분을 소모했습니다.
이후 E번과 F번을 풀기 위해서 대회 종료시각까지 트라이를 했지만 풀이하지 못했습니다.
rating이 떨어지나 걱정했지만, 다행히도 rating이 약간 올라서 안심했습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc399/editorial&quot;&gt;공식 에디토리얼 (해설)&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;풀이&quot;&gt;풀이&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;해설은 꼭 문제를 한번 읽고 확인해주세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;a---hamming-distance&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc399/tasks/abc399_a&quot;&gt;A - Hamming Distance&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;문제-내용&quot;&gt;문제 내용&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;두 문자열이 주어진다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;두 문자열의 해밍 거리 (서로 다른 문자의 개수)를 구하면 된다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;풀이-1&quot;&gt;풀이&lt;/h3&gt;
&lt;p&gt;문자열을 순회하면서 서로 다른 문자의 개수를 구하면 됩니다.&lt;/p&gt;
&lt;h2 id=&quot;b---ranking-with-ties&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc399/tasks/abc399_b&quot;&gt;B - Ranking with Ties&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;문제-내용-1&quot;&gt;문제 내용&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;N 개의 score가 주어집니다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;각 score마다 RANK() 를 구하면 됩니다. (sql의 RANK()와 같이)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;풀이-2&quot;&gt;풀이&lt;/h3&gt;
&lt;p&gt;정렬을 사용하거나, map을 사용하거나 기타 등등 RANK()를 구현하기만 하면 됩니다.&lt;/p&gt;
&lt;h2 id=&quot;c---make-it-forest&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc399/tasks/abc399_c&quot;&gt;C - Make it Forest&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;문제-내용-2&quot;&gt;문제 내용&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;무향 그래프 F가 주어집니다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;간선을 지워 cycle이 없는 그래프가 만드려고 합니다. 이때, 지워야 하는 간선의 최소 개수를 구해야 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;풀이-3&quot;&gt;풀이&lt;/h3&gt;
&lt;p&gt;처음에 이렇게 풀어도 되는건가? 좀 헷갈렸다.
몇 가지 그래프를 그리다보니 확신을 하게 되었고, 아래와 같이 구성을 했다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1 ~ N 까지 정점을 탐색하는데, 각 정점이 방문되지 않은 경우 DFS 탐색을 한다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;그리고, 만약 이전에 방문했음에도 다시 방문하게 되면 카운팅한다. &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;단, 부모로 다시 탐색을 하러 돌아가는 경우는 배제해야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;d---bonfire&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc398/tasks/abc398_d&quot;&gt;D - Bonfire&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;문제-내용-3&quot;&gt;문제 내용&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;같은 숫자임에도 서로 인접하지 않은 두 숫자를 고른다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;두 숫자의 위치를 서로 바꾸어봤을 때, 각 숫자가 인접하게 된다면 카운팅한다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;풀이-4&quot;&gt;풀이&lt;/h3&gt;
&lt;p&gt;솔직히 이 문제가 D번이 맞나? 싶었다.
생각보다 너무 쉽게 풀리는 문제였다.&lt;/p&gt;
&lt;p&gt;그냥 각 숫자마다 위치 2개를 따로 hash 또는 배열에 저장해둔다.&lt;/p&gt;
&lt;p&gt;그리고 앞에서부터 순회하면서 인접한 두 숫자에 대해서 저장해둔 위치로 조건을 판단해보면 된다.&lt;/p&gt;
&lt;h2 id=&quot;e---replace&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc399/tasks/abc399_e&quot;&gt;E - Replace&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;문제-내용-4&quot;&gt;문제 내용&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;문자열 S와 T가 주어진다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;문자열 S를 T로 바꾸길 원한다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;다만, 문자열 S에 존재하는 임의의 문자를 모두 하나의 문자로 바꾸는 연산만 가능한 상황이다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;이때, S를 T로 바꾸는 것이 가능한지, 가능하다면 최소 연산의 수가 어떻게 되는지 구해야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;풀이-5&quot;&gt;풀이&lt;/h3&gt;
&lt;p&gt;결국 풀이하지 못한 채로 대회가 종료되었다.&lt;/p&gt;
&lt;p&gt;내 접근은 S-&gt;T로 가기 위한 과정을 유향 그래프화 시키는 것이었다.
만약 ab -&gt; cb 라면 a -&gt; c 라는 간선을 추가하는 것처럼 말이다.&lt;/p&gt;
&lt;p&gt;이 과정에서 cycle이 없다면 간선의 수가 답이었고, cycle이 있다면 cycle로 변하는 과정에서 임의의 temp 문자로 변환되었다가 맨마지막에 변환되는 식이 되지 않을까 해서 간선의 수 + 1 을 더하는 방식이었다.&lt;/p&gt;
&lt;p&gt;다만 이 과정을 구하는게 까다로웠고, 현재 temp 문자로 사용할 수 있는 문자가 있는지 등을 체크하기 위해 SCC와 위상정렬을 막 적용하다가 시간이 끝났다…&lt;/p&gt;
&lt;h1 id=&quot;결론&quot;&gt;결론&lt;/h1&gt;
&lt;p&gt;7문제 중 4문제를 풀이하고 끝나서 굉장히 찝찝한 contest였다.
트리나 그래프 문제가 나오면 아직도 망설임이 좀 있는 것 같다. 관련 문제와 아이디어들을 좀 더 접할 필요가 있는 것 같다.&lt;/p&gt;</content:encoded><category>atcoder</category><category>문제풀이</category><author>koa (김신건)</author></item><item><title>Atcoder Beginner Contest 398 후기</title><link>https://shinkeonkim.com/posts/atcoder/2025-03-23-abc-398/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/atcoder/2025-03-23-abc-398/</guid><description>2025년 3월 22일에 진행된 Atcoder Beginner Contest 398에서 풀이한 문제들과 풀이 방법, 그리고 대회 경험을 공유하는 후기입니다.</description><pubDate>Sun, 23 Mar 2025 02:20:00 GMT</pubDate><content:encoded>&lt;h1 id=&quot;개요&quot;&gt;개요&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc398&quot;&gt;대회 링크&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;어제 (03/22) 저녁 9시부터 10시 40분까지 진행된 [[Atcoder]] Beginner Contest 398 후기입니다.&lt;/p&gt;
&lt;p&gt;총 7문제 중 6문제를 풀었습니다.&lt;/p&gt;
&lt;p&gt;A번부터 D번까지 풀이하는데 20분을 소모했고,
E번이 interactive 문제였고, 아이디어가 떠오르지 않아 F번 먼저 풀이하였고 이때 20분 정도 시간이 걸렸습니다.
그 이후, E번 풀이를 떠올리고 풀이하는데 25분 가량 걸렸습니다.
그리고도 시간이 남아서 G번을 확인하였습니다.
다만, 이때까지도 모든 문제를 풀이한 사람이 없던 상황이었고, G번의 난이도가 쉽지 않다는 것을 알게 되었습니다.
여러 접근을 했지만 풀이를 알아내지 못하고 대회가 종료되었습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc398/editorial?editorialLang=ja&quot;&gt;공식 에디토리얼 (해설)&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;풀이&quot;&gt;풀이&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;해설은 꼭 문제를 한번 읽고 확인해주세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;a---doors-in-the-center-&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc398/tasks/abc398_a&quot;&gt;A - Doors in the Center &lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;문제-내용&quot;&gt;문제 내용&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 와 = 로 구성된 팰린드롬 문자열을 만드는 문제이다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;풀이-1&quot;&gt;풀이&lt;/h3&gt;
&lt;p&gt;주어지는 N이 홀수인지, 짝수인지에 따라 문자열을 구성하면 된다.&lt;/p&gt;
&lt;h2 id=&quot;b---full-house-3&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc398/tasks/abc398_b&quot;&gt;B - Full House 3&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;문제-내용-1&quot;&gt;문제 내용&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;7개의 숫자가 주어진다. 이 숫자를 조합하여 풀하우스를 만들 수 있는지 구하면 된다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;풀이-2&quot;&gt;풀이&lt;/h3&gt;
&lt;p&gt;서로 다른 숫자 a, b에 대해, a의 개수는 3개 이상, b의 개수는 2개 이상인지 검사하면 된다.ㄴ&lt;/p&gt;
&lt;h2 id=&quot;c---uniqueness&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc398/tasks/abc398_c&quot;&gt;C - Uniqueness&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;문제-내용-2&quot;&gt;문제 내용&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1 ~ N 번 사람이 각자 숫자를 가지고 있다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;다른 사람들이 가지고 있지 않는 사람들 중에, 가지고 있는 숫자가 가장 큰 사람의 번호를 반환해야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;풀이-3&quot;&gt;풀이&lt;/h3&gt;
&lt;p&gt;솔직히 지문을 읽고, 뭔 이상한 소리인가 싶었고, 예제 또한 이상하게 주어져있어서 조금 당황했다.
discussion에서 다른 사람들도 헷갈릴 여지가 있었던 것으로 보인다.&lt;/p&gt;
&lt;p&gt;위에 문제 내용을 그대로 구현하면 된다.&lt;/p&gt;
&lt;h2 id=&quot;d---bonfire&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc398/tasks/abc398_d&quot;&gt;D - Bonfire&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;문제-내용-3&quot;&gt;문제 내용&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;모닥불에서 연기가 생성된다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;각 시간(틱)마다 바람이 분다. 이때 특정 (R, C)에 있는 사람에게 연기가 닿았는지 확인하여 모든 시간마다의 결과를 출력한다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;풀이-4&quot;&gt;풀이&lt;/h3&gt;
&lt;p&gt;원래라면 모닥불로 하여금 생긴 연기를 계속 움직여가며 판단할 수 있다.
하지만 연기의 최대 개수가 200,000 개 이기 때문에 N^2이 되는 순간 해결할 수가 없다.
그래서 문제를 보자마자 바로 구현하기 시작한건 연기를 고정시키고 모닥불(0, 0)과 사람 (R, C)을 계속 이동시키자였다.&lt;/p&gt;
&lt;p&gt;아래와 같이 구현했다. 다만 좌표를 저장할때 특정 int value로 담아두고 싶어서 좌표를 변환하여 했다. 지금 생각해보면 그냥 tuple로 저장해도 되었을 텐데라는 아쉬움이 남는다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;DIFF&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 400000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;K &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10000000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; to_axis&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(y, x):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; y &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; K &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; solve&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  n, r, c &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; mii()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; inp()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  maker &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;DIFF&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;DIFF&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  dy &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;S&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;W&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;E&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  dx &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;S&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;W&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;E&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  r &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; DIFF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  c &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; DIFF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  smokes &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ans &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    direction &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s[i]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    axis &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; to_axis(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;maker)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    smokes[axis] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; True&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    maker[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; dy[direction]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    maker[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; dx[direction]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    r &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; dy[direction]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    c &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; dx[direction]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; smokes.get(to_axis(r, c), &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;False&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      ans &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      ans &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;0&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(ans)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;e---tree-game&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc398/tasks/abc398_e&quot;&gt;E - Tree Game&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;문제-내용-4&quot;&gt;문제 내용&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;트리가 주어진다. 이때 트리에 간선을 추가하는 액션을 각 턴마다 진행한다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;단, 간선을 추가함으로서 홀수개의 노드로 구성된 cycle이 생기면 안된다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;더이상 추가할 수 있는 간선이 없는 경우 패배한다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;상대와 게임을 진행함에 있어서, 선공/후공을 정하여 승리해야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;풀이-5&quot;&gt;풀이&lt;/h3&gt;
&lt;p&gt;처음에는 인터랙티브 문제이기도 하고 풀이가 잘 떠오르지 않았다.
그러던 중 예시를 여러 개 만들어보다가 떠오른 생각이 있었다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;처음에 주어지는 트리 상에서, 서로의 거리가 홀수로 떨어져 있는 경우면서 바로 이어지지 않은 경우가 결국 간선을 만들어낼 수 있는 경우 아닌가?&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;정점의 개수 N이 최대 100까지였기 때문에 구현을 빠르고 쉽게하기 위해, 플로이드-와샬로 미리 거리를 구했고,
&lt;code&gt;서로의 거리가 홀수로 떨어져 있는 경우면서 바로 이어지지 않은 경우&lt;/code&gt; == &lt;code&gt;ar[x][y] % 2 == 1 &amp;#x26;&amp;#x26; ar[x][y] &gt; 1&lt;/code&gt;에 대한 간선을 미리 구해두었다.&lt;/p&gt;
&lt;p&gt;그래서 이 간선들을 토대로 내 턴에는 아무거나 출력하고, 상대 턴에는 주어지는 간선을 제거하면서 처리해봤다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ll ar[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;110&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;110&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; solve&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ll N;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N; j&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      ar[i][j] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; INF;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ar[i][i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a, b;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ar[a][b] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ar[b][a] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; z &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; z &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N; z&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; x &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; x &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N; x&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; y &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; y &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N; y&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(ar[x][y] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ar[x][z] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ar[z][y]) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          ar[x][y] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ar[x][z] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ar[z][y];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  vector &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;pii&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ans_list;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; x &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; x &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N; x&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; y &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; x &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; y &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N; y&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(ar[x][y] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ar[x][y] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) ans_list.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ x, y });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(ans_list.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Second&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; endl;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;First&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; endl;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ans_list[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;].first &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot; &quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ans_list[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;].second &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; endl;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ans_list.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;erase&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(ans_list.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a, b;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;      swap&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a, b);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ans_list.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      pii current &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ans_list[i];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(current.first &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; current.second &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        ans_list.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;erase&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(ans_list.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        break&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ans_list[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;].first &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot; &quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ans_list[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;].second &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; endl;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ans_list.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;erase&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(ans_list.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;f---abcba&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc398/tasks/abc398_f&quot;&gt;F - ABCBA&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;문제-내용-5&quot;&gt;문제 내용&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;문자열 S가 주어졌을 때, 문자열 S를 prefix로 하는 팰린드롬을 만들어야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;풀이-6&quot;&gt;풀이&lt;/h3&gt;
&lt;p&gt;보자마자 manacher 알고리즘이 떠올랐다.
manacher 알고리즘은 특정 위치를 중심으로 팰린드롬의 길이를 구할 수 있는 알고리즘이다.
만약 이렇게 어떤 위치에서 구한 팰린드롬이 문자열 끝까지 도달할 수 있다면, 문제에서 원하는 문자열 S를 prefix로 하는 팰린드롬을 만들 수 있는 상황일 것이다. 따라서 앞에서부터 순차적으로 확인하다가 해당 경우인경우 바로 출력하게 했다.&lt;/p&gt;
&lt;p&gt;단, 이때 홀수 길이의 팰린드롬과 짝수 길이의 팰린드롬인지에 따라 약간의 구현 처리가 필요하다.&lt;/p&gt;
&lt;p&gt;아래 코드는 manacher 알고리즘의 일부 구현 내용을 생략하여 문제에 맞게 활용한 코드이다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt; &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;manacher&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;){&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(), R &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, p &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;int&gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; A&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;n; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;){&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; R) A[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; min&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(A[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;i], R&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;i);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;A[i]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;A[i]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s[i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;A[i]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s[i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;A[i]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]) A[i]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;A[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; R) R &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;A[i], p &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; A;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; space&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;){&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    string t;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;char&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; c: s) t&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; c, t&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos; &apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    t.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pop_back&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; t;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; solve&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  string s, o;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  o &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; space&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  vector &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;int&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ret_1 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; manacher&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; k &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ret_1.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ans &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ret_1.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; k; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ret_1[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; k &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      ans &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      break&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(ans &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; org_idx &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ans &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; org_idx; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; o[i];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; org_idx &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; o[i];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; org_idx &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ans &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; org_idx; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; o[i];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; org_idx; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; o[i];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;g---not-only-tree-game&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc398/tasks/abc398_g&quot;&gt;G - Not Only Tree Game&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;문제-내용-6&quot;&gt;문제 내용&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;E번에서 주어지는 문제 조건과 유사하다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;단, 해당 문제에서는 트리가 아닌 그래프가 주어진다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;심지어 서로 연결되어 있지 않는 경우도 존재한다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;이때 2명의 플레이어가 게임을 진행한다고 했을 때 어떤 플레이어가 이기는지 출력해야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;풀이-7&quot;&gt;풀이&lt;/h3&gt;
&lt;p&gt;풀이가 전혀 떠오르지 않았다.
에디토리얼은 &lt;a href=&quot;https://atcoder.jp/contests/abc398/editorial/12521&quot;&gt;여기&lt;/a&gt; 있다.&lt;/p&gt;
&lt;h1 id=&quot;결론&quot;&gt;결론&lt;/h1&gt;
&lt;p&gt;그래도 7문제중 6문제를 무난하게 풀이한 contest 였다.
오랫동안 굳었던 머리가 다시 풀리는 느낌이라 좋았던 대회지만, 대회 자체의 문제 난이도와 배치는 조금 이상했던 것 같다.&lt;/p&gt;</content:encoded><category>atcoder</category><category>문제풀이</category><author>koa (김신건)</author></item><item><title>Atcoder Beginner Contest 396 후기</title><link>https://shinkeonkim.com/posts/atcoder/2025-03-09-abc-396/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/atcoder/2025-03-09-abc-396/</guid><description>2025년 3월 8일에 진행된 Atcoder Beginner Contest 396에서 풀이한 문제들과 풀이 방법, 그리고 대회 경험을 공유하는 후기입니다.</description><pubDate>Sun, 09 Mar 2025 09:20:00 GMT</pubDate><content:encoded>&lt;h1 id=&quot;개요&quot;&gt;개요&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc396&quot;&gt;대회 링크&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;어제 (03/08) 저녁 9시부터 10시 40분까지 진행된 [[Atcoder]] Beginner Contest 396 후기입니다.&lt;/p&gt;
&lt;p&gt;총 7문제 중 5문제를 풀었습니다.
A ~ D번까지 문제를 보자마자 바로 풀이하였고, 21분 소요했습니다. 여전히 구현이 느립니다. 더 땡겨야 합니다.
E번 문제를 대강 풀이하고 제출했는데, 최적화된 해답을 출력하지 않았고, 이를 해결하는데 시간을 오래 사용했습니다.
마지막 제출을 대회 종료 5초전에 했고, 대회가 종료된 후 AC를 확인했습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc396/editorial&quot;&gt;공식 에디토리얼 (해설)&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;풀이&quot;&gt;풀이&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;해설은 꼭 문제를 한번 읽고 확인해주세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;a---triple-four-&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc396/tasks/abc396_a&quot;&gt;A - Triple Four &lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3번 연속된 숫자가 있는 경우, Yes 아니면 No를 출력한다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;문제에 주어지는대로 바로 구현하면 됩니다.&lt;/p&gt;
&lt;h2 id=&quot;b---card-pile&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc396/tasks/abc396_b&quot;&gt;B - Card Pile&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;스택에 카드를 넣는 연산과 맨 위의 카드를 확인한 후, 빼는 연산 구현&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;문제에서 주어지는대로 스택을 사용하면 됩니다. 단, 100개의 0을 이미 넣어놓은채 시작하는 전제조건을 확인해야 합니다.&lt;/p&gt;
&lt;h2 id=&quot;c---buy-balls&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc396/tasks/abc396_c&quot;&gt;C - Buy Balls&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;검정색 공들과 흰색 공들이 숫자가 적혀진 채로 주어진다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;각 공을 고르고, 고른 공의 숫자들을 합쳤을 때 최대가 되도록 해야 한다. 단, 고른 검정색 공의 수가 흰색 공의 수보다 크거나 같아야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;아래와 같이 그리디하게 최대한 검정, 흰색을 동시에 선택하다가, 흰색공을 선택하지 않아도 되는 경우에는 검정색만 고르도록 했다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; solve&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  B &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; sorted&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(B, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;reverse&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  W &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; sorted&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(W, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;reverse&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;min&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n, m)):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; B[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; W[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; W[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; B[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; W[i]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    elif&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; B[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; B[i]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;min&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n, m), n):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; B[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; B[i]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;d---minimum-xor-path&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc396/tasks/abc396_d&quot;&gt;D - Minimum XOR Path&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;그래프가 주어진다. 그래프의 간선에 가중치가 주어진다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;다만, 해당 가중치를 더하는 연산이 아닌, XOR 연산을 수행했을 때, 1 ~ N 까지 단순 경로로 도달했을 때 최소 값을 구하라&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;N이 크지 않게 주어졌다. DFS로 모든 단순 경로를 탐색하도록 했다. 아래에 일부 코드를 적어두었다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; m &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;edges &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; []&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;mn &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; []&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;chk &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; []&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dfs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(node, label):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  global&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n, m, edges, mn, chk&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; chk[node]:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  chk[node] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; True&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  mn[node] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; min&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(mn[node], label)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; edge &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; edges[node]:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    dfs(edge[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;], label &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;^&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; edge[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  chk[node] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; solve&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  global&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n, m, edges, mn, chk&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  dfs(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(mn[n])&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;e---min-of-restricted-sum&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc396/tasks/abc396_e&quot;&gt;E - Min of Restricted Sum&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;문제가 복잡하게 주어졌지만, 요약하자면 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;노드 번호1, 노드번호2, 두 노드 사이의 가중치가 나열된다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;각 노드마다의 값을 구해야 한다. 이때 각 노드 사이의 값 끼리 XOR연산을 했을 때 주어지는 가중치와 동일하도록 해야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;문제를 보다보니, XOR 연산의 특성을 고민해보다 결국 시작 노드에서 아무 값으로 시작해도 그래프가 정상적으로 주어졌다면 어떻게든 값이 나온다는 사실을 알았다.
그래서 무작정 각 노드마다 탐색을 해서, 탐색이 되지 않은 경우 0으로 시작해서 그래프를 탐색하도록 했다.&lt;/p&gt;
&lt;p&gt;하지만, 이는 틀린 답이었고, 이유를 찾지 못하다가 뒤늦게 문제 상 주어진 조건을 놓쳤음을 알게 되었다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;If there are multiple good sequences with the same minimum sum, printing any of them is accepted.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;그럼 최소를 어떻게 찾아야할까&lt;/code&gt;를 계속 고민하다가, 각 그래프 탐색을 하면서 탐색이 된 노드들을 그룹지어놓고,
각 그룹마다 1, 2, 4, 8, 16, … 를 모든 노드값에 XOR 연산을 하면서 최소값이 된 경우 갱신을 하는식으로 구현을 추가했다.&lt;/p&gt;
&lt;p&gt;해당 구현을 하다가 조금 구현 실수를 하면서 WA를 계속 맞았지만, 대회 종료 직전에 제출한 코드가 AC를 받으면서 종료되었다.&lt;/p&gt;
&lt;h1 id=&quot;결론&quot;&gt;결론&lt;/h1&gt;
&lt;p&gt;이번에는 E번 문제를 좀 쉽게 접근하고나서, 더 생각이 떠오르지 않아 망설임이 많았습니다.
XOR 연산에 대해서 좀더 잘 알게 된 competition이었던 것 같습니다.&lt;/p&gt;</content:encoded><category>atcoder</category><category>문제풀이</category><author>koa (김신건)</author></item><item><title>Atcoder Beginner Contest 395 후기</title><link>https://shinkeonkim.com/posts/atcoder/2025-03-02-abc-395/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/atcoder/2025-03-02-abc-395/</guid><description>2025년 3월 1일에 진행된 Atcoder Beginner Contest 395에서 풀이한 문제들과 풀이 방법, 그리고 대회 경험을 공유하는 후기입니다.</description><pubDate>Sun, 02 Mar 2025 02:50:00 GMT</pubDate><content:encoded>&lt;h1 id=&quot;개요&quot;&gt;개요&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc395&quot;&gt;대회 링크&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;어제 (03/01) 저녁 9시부터 10시 40분까지 진행된 [[Atcoder]] Beginner Contest 395 후기입니다.&lt;/p&gt;
&lt;p&gt;총 7문제 중 5문제를 풀었습니다.
A ~ E번까지 문제를 보자마자 해답은 바로 떠올랐지만, 코드를 작성하는 시간이 오래 걸렸습니다.
F번, G번 문제를 읽고나서 도저히 바로 해답이 안떠올라서 대회를 그대로 종료했습니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://shinkeonkim.com/img/posts/2025/03/02/atcoder-abc-395-result.png&quot; alt=&quot;result&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc395/editorial?editorialLang=ja&quot;&gt;공식 에디토리얼 (해설)&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;풀이&quot;&gt;풀이&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;해설은 꼭 문제를 한번 읽고 확인해주세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;a---strictly-increasing&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc395/tasks/abc395_a&quot;&gt;A - Strictly Increasing?&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;N 개의 숫자가 주어집니다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;N 개의 숫자들이 엄밀하게 증가하는 수열로 주어졌는지 판단하면 됩니다. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그냥 구현하면 됩니다.&lt;/p&gt;
&lt;h2 id=&quot;b---make-target&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc395/tasks/abc395_b&quot;&gt;B - Make Target&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;자연수 N이 주어집니다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;문제 규칙에 맞게 `#`과 `.`을 찍으면 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;수식으로 바로 해결해도 되고, N의 범위가 작기 때문에 반복문으로 돌려도 충분히 해결됩니다.&lt;/p&gt;
&lt;h2 id=&quot;c---shortest-duplicate-subarray&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc395/tasks/abc395_c&quot;&gt;C - Shortest Duplicate Subarray&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;N 개의 숫자가 주어집니다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;주어지는 수열에서 `중복되는 숫자가 있는 부분 수열 중 최소 길이`를 구해야 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;언뜻보면 브루트포싱으로 할 수 있겠다 싶지만, 숫자 범위가 그렇지 않습니다.
곧바로 각 숫자마다 분류하여 index를 저장했고, 각 index를 훑으면서 최소 격차를 가진 곳을 찾아 반환했습니다.&lt;/p&gt;
&lt;p&gt;(처음에 문제를 잘못 읽어서 중복된 숫자가 없는 수열로 보았다가 시간 낭비를 했습니다.)&lt;/p&gt;
&lt;h2 id=&quot;d---pigeon-swap&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc395/tasks/abc395_d&quot;&gt;D - Pigeon Swap&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;해당 문제에서는 3가지의 연산이 있습니다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1. 비둘기 한 마리가 이동한다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2. 두 둥지에 있는 비둘기들이 서로 다 바꾼다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3. A번 비둘기가 어디있는지 출력한다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;저는 이 문제를 보자마자, 그냥 어? 둥지 안에 있는 비둘기를 서로 바꾸는게 아니라 둥지에 가상의 라벨이 붙어있다고 생각하고, 그 라벨을 바꿔 붙였다고 생각하면 되는거 아닌가? 라고 생각을 했습니다.&lt;/p&gt;
&lt;p&gt;그래서 비둘기마다 위치하는 둥지 위치, 각 둥지(번호를 매겨놓은)마다 붙어 있는 라벨, 각 라벨마다 붙어있는 둥지 원래 번호를 각각 저장했고
제 연산마다 적재적소로 활용해서 문제를 풀이했습니다.&lt;/p&gt;
&lt;p&gt;어찌보면 포인터를 활용했다고 할 수 있겠네요.&lt;/p&gt;
&lt;p&gt;아래는 코드의 일부 내용입니다&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; solve&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  N, Q &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; mii()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  pigeon_place &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, N)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  place_label &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, N)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  place_label_rev &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; place_label:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    place_label_rev[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; _ &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(Q):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    commands &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; mii()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; commands[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      a, b &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; commands[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; b &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      pigeon_place[a] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; place_label_rev[b]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    elif&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; commands[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      a, b &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; commands[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; b &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      A &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; place_label_rev[a]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      B &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; place_label_rev[b]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      place_label[A], place_label[B] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; place_label[B], place_label[A]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      place_label_rev[a], place_label_rev[b] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; B, A&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; commands[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(place_label[pigeon_place[a]] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;e---flip-edge&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc395/tasks/abc395_e&quot;&gt;E - Flip Edge&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;그래프가 주어집니다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;이때 1번 노드에서 N번 노드로 이동하면서 최단 거리를 알아내야 합니다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;단, 각 간선의 길이는 무조건 1입니다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;그리고 모든 간선의 방향을 뒤바꾸는 연산을 하면서 X 비용을 낼 수도 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;저는 문제를 보고, 이건 무조건 다익스트라 알고리즘으로 하면 되겠다 였고, 단 거리를 저장하는데 있어서
&lt;code&gt;Distance[어느 방향으로 이 노드에 도달했는가? (0: 정방향, 1: 역방향)][노드 번호]&lt;/code&gt;와 같이 거리를 저장하기로 했고
각 노드에서 다시 방향을 유지하여 갈때는 원래 비용인 1을 사용하고, 방향을 바꿔서 갈때는 X + 1을 사용하여 가기로 설정했습니다.&lt;/p&gt;
&lt;p&gt;아래는 코드의 일부 내용입니다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Edge&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ll node;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ll cost;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ll direction;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  Edge&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ll&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; node&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ll&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; cost&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ll&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; direction&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) : &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(node), &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cost&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(cost), &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;direction&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(direction) {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  bool&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; operator&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Edge&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;to&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cost &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; to.cost;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ll N, M, X;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Edge&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; edges;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ll dist[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;220000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ll&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dijkstra&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ll&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  priority_queue&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Edge&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pq;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  pq.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Edge&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ll&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  pq.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Edge&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s, X, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  dist[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][s] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  dist[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][s] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; X;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt; // 모든 엣지를 역방향으로 바꾸면서 시작하는 경우&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;pq.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;empty&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Edge cur &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pq.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    pq.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pop&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (cur.cost &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; dist[cur.direction][cur.node]) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;continue&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // 만약 정방향으로 간다면&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;auto&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nxt : edges[cur.direction][cur.node]) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (dist[cur.direction][nxt.node] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cur.cost &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nxt.cost) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        dist[cur.direction][nxt.node] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cur.cost &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nxt.cost;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        pq.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Edge&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(nxt.node, dist[nxt.direction][nxt.node], cur.direction));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // 만약 역방향으로 바꿔서 간다면&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;auto&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nxt : edges[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cur.direction][cur.node]) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (dist[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cur.direction][nxt.node] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cur.cost &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; X &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nxt.cost) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        dist[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cur.direction][nxt.node] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cur.cost &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; X &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nxt.cost;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        pq.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Edge&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(nxt.node, dist[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cur.direction][nxt.node], &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cur.direction));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; min&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(dist[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][N], dist[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][N]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; solve&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, M) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ll a, b; cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    edges[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][a].&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Edge&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(b, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    edges[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][b].&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Edge&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dijkstra&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;f---smooth-occlusion&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc395/tasks/abc395_f&quot;&gt;F - Smooth Occlusion&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;풀이 X..&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;g---minimum-steiner-tree-2&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc395/tasks/abc395_g&quot;&gt;G - Minimum Steiner Tree 2&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;풀이 X..&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;결론&quot;&gt;결론&lt;/h1&gt;
&lt;p&gt;무난하게 5문제를 풀이하고나서, F, G번을 트라이할만한 시간이 남은 competition이었습니다.
다만, 오랜 기간동안을 손을 놓아서인지 구현 속도가 느리기도 했고 조금이라도 어려운 요소가 섞이니 접근이 잘 안되고 있습니다.
백준에서 골드/플레 문제 풀이를 해야할 것 같습니다..&lt;/p&gt;</content:encoded><category>atcoder</category><category>문제풀이</category><author>koa (김신건)</author></item><item><title>새로운 시작을 준비하며, 그렙을 떠나 다시 학교로 돌아갑니다</title><link>https://shinkeonkim.com/posts/my-life/2025-02-26-grepp-memoir/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/my-life/2025-02-26-grepp-memoir/</guid><description>그렙에서의 지난 여정을 돌아보며, 앞으로의 새로운 도전을 위해 대학으로 복학하기로 한 결심과 그 배경에 대해 공유하는 회고록입니다.</description><pubDate>Wed, 26 Feb 2025 04:25:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;새로운-시작을-준비하며-그렙을-떠나-다시-학교로-돌아갑니다&quot;&gt;새로운 시작을 준비하며, 그렙을 떠나 다시 학교로 돌아갑니다&lt;/h2&gt;
&lt;p&gt;안녕하세요, 백엔드개발자 김신건, Koa 입니다.
저는 2019년부터 함께한 그렙(Grepp)을  떠나, 다시 대학교로 돌아가기로 결심했습니다.&lt;/p&gt;
&lt;p&gt;오랜 시간 인턴부터 정직원까지 쌓아온 경험과 애정이 깊은 회사지만, 지금은 제 자신을 더 깊이 탐구하기 위해 돌아가야 할 시점이라 느끼게 되었습니다.
이 결정은 분명 쉽지 않았습니다. 이 결정이 또 다른 성장의 기회가 될 거라 믿습니다.&lt;/p&gt;
&lt;p&gt;그렙과의 지난 여정을 정리하면서, 저의 지난 발자취에 대해서도 공유해보고자 합니다.&lt;/p&gt;
&lt;h2 id=&quot;c-언어-하나로-바뀐-꿈&quot;&gt;C 언어 하나로 바뀐 꿈&lt;/h2&gt;
&lt;p&gt;저는 개발자를 꿈꾸던 사람이 아닙니다.&lt;/p&gt;
&lt;p&gt;저는 어릴 적부터 기계공학자를 꿈꾸었고, 기계나 로봇을 설계하고, 설계한 것이 실제로 움직이는 걸 보면 가슴이 뛰는 아이였습니다. 하지만 “과연 내가 기계를 아주 잘 설계하고, 활용할 수 있는 사람인가?” 하는 근본적인 의문이 늘 따라다녔습니다. 그런 고민을 품고 지내던 중, 고등학교(한민고등학교) 방과 후 수업에서 C 프로그래밍을 처음 접했습니다.&lt;/p&gt;
&lt;p&gt;처음에는 그저 호기심으로 시작했던 C 언어 공부였지만, 코드업(CodeUp) 사이트의 기초 100제를 풀어나가는 과정이 꽤 재미있었습니다. &lt;code&gt;“나, 이거 꽤 잘하는 것 같은데?”&lt;/code&gt; 라는 작은 자신감이 쌓인 후, 300문제, 400문제를 연달아 풀었습니다. 그리고 곧장 정보선생님에게 찾아가 지금 당장 해야하는 공부에 댈해서 질문했습니다. 그렇게 알고리즘과 자료구조에도 본격적으로 입문했습니다. (그렇게 내신 성적은 점점 떨어졌지만요)&lt;/p&gt;
&lt;p&gt;이때부터 여러 알고리즘 대회에 참가하기 시작했습니다. 다른  대회 참가자들에 비해 늦게 출발한 만큼 화려한 수상 성적을 거두진 못했습니다. 그래도 꾸준히 노력한 덕분에 가끔씩 장려상이나 동상을 받았고, 그 경험들이 저에겐 큰 동기부여가 되었습니다. 그리고 그 많은 대회 속에서 프로그래머스(Programmers) 사이트를 통해 대회가 진행되었는데, 이 플랫폼을 운영하는 기업이 바로 &lt;code&gt;그렙&lt;/code&gt;이라는 사실을 훗날 알게 됩니다.&lt;/p&gt;
&lt;h2 id=&quot;소프트웨어-특기자-전형으로-대학에-입학하다&quot;&gt;소프트웨어 특기자 전형으로 대학에 입학하다&lt;/h2&gt;
&lt;p&gt;고등학교 시절 학업 성적은 점점 떨어졌지만, 그동안 쌓아온 대회 수상 기록, 소논문 등으로 소프트웨어 특기자 전형에 도전했습니다. 6개의 대학에 지원했지만 그 중 5개는 고배를 마셨고, 마지막 한 곳에서 극적으로 합격 통지를 받았습니다. 그렇게 대학교에 입학해, 1학년 1학기를 보내며 여러 수업을 들었고, 방학 시즌에 현장실습을 하면 학점과 인턴 월급을 함께 받을 수 있다는 사실을 알게 되었습니다.&lt;/p&gt;
&lt;p&gt;당시 여러 회사에 지원했지만, 최종적으로 그렙의 알고리즘 콘텐츠 제작 인턴으로 합격하여 방학을 그렙에서 보내게 되었습니다. 이 시기가 저와 그렙의 인연이 본격적으로 시작된 때입니다.&lt;/p&gt;
&lt;h2 id=&quot;1학년-1학기-방학-그렙에서-첫-인턴십&quot;&gt;1학년 1학기 방학, 그렙에서 첫 인턴십&lt;/h2&gt;
&lt;p&gt;처음 회사로 출근하여, &lt;code&gt;“내가 지금까지 공부해온 게 실제로 이렇게 쓰이는구나!”&lt;/code&gt;라는 사실이 무척 신기했습니다. 특히 제가 대회에서 사용했던 프로그래머스 서비스 내의 알고리즘 콘텐츠/문제들을 제작하는 과정에 기여할 수 있었다는 점이 큰 보람으로 다가왔습니다.&lt;/p&gt;
&lt;p&gt;그래서 저는 최대한 열심히 업무를 수행했고, 저 스스로의 최대한의 역량을 발휘했습니다. 그리고 그렙에서 인연을 이어가며, 2학년 1학기 방학 때까지 알고리즘 콘텐츠 제작자로 계속 근무할 기회를 얻었습니다.&lt;/p&gt;
&lt;h2 id=&quot;2학년-이후-웹-개발로-시야를-넓히다&quot;&gt;2학년 이후, 웹 개발로 시야를 넓히다&lt;/h2&gt;
&lt;p&gt;1학년에서 2학년 사이 기간 동안 스스로 한계를 느끼기도 했습니다. &lt;code&gt;“내가 잘하는 건 알고리즘 문제 풀이뿐인가?”&lt;/code&gt;라는 생각이 들었습니다.&lt;/p&gt;
&lt;p&gt;1학년의 저는 알고리즘만 아는 코더였던거죠. 그냥 문제 풀이만 할 줄 아는 사람이었습니다. 그것도 깊게 하지 못하는.
굉장히 스스로 부끄러웠고, 발전이 되고 있지 않았다는 것을 느꼈습니다. 마침 주변 지인들의 조언으로 웹 개발 동아리에 들어가게 됐고, 그곳에서 처음 웹 프레임워크와 프로젝트 구축 방법을 익혔습니다. 2학년 2학기가 끝나갈 즈음, “알고리즘 관련 말고, 웹 개발로 인턴을 할 수 있는 곳이 없을까?” 고민하던 차에, 그렙에서 개발 인턴으로 근무해볼 생각이 없는지 제안을 받았습니다. 덕분에 그렙과의 인연은 또 다른 국면에 접어들었습니다.&lt;/p&gt;
&lt;h2 id=&quot;정직원으로-그렙에-합류-그리고-군-복무&quot;&gt;정직원으로 그렙에 합류, 그리고 군 복무&lt;/h2&gt;
&lt;p&gt;방학 인턴으로 웹 개발에 본격 뛰어들면서, 제가 실제로 사용하던 프로그래머스 서비스를 직접 개발하게 된다는 점이 참으로 매력적이었습니다. &lt;code&gt;Ruby on Rails&lt;/code&gt;를 처음 접했고, &lt;code&gt;Vue.js&lt;/code&gt;도 함께 다루면서 프론트엔드와 백엔드 양쪽을 모두 맛볼 수 있었습니다.&lt;/p&gt;
&lt;p&gt;방학이 끝난 후 선택지가 생겼습니다. “계속 학교를 다닐까, 아니면 휴학 후 정직원으로 일하며 더 빠르게 성장할까?” 고민 끝에 저는 그렙에서 정직원으로 근무하기로 했습니다. 이후 2021년, 2022년에 걸쳐 &lt;code&gt;채용사업부&lt;/code&gt;의 개발자로서 &lt;code&gt;프로그래머스 채용 서비스&lt;/code&gt;와 비즈니스 서비스를 구축하고 개선하는 업무를 맡았습니다. 점차 백엔드 분야에 더 흥미를 느끼게 되어 서버 쪽을 심도 있게 파고들면서, 개발자로서의 시야를 넓혀갔습니다.&lt;/p&gt;
&lt;p&gt;그러나 그 시기에 산업기능요원 제도가 바뀌면서, 저처럼 현역 판정인 사람은 산업체 복무가 불가능해졌습니다. 결국 군대를 더 이상 미룰 수 없다고 판단해 갑작스럽게 군대를 가게 되었습니다. 인생 계획이 어그러진 느낌이었지만, 한편으로는 “군대에서 조금이라도 휴식과 함께 생각을 정리할 수 있는 기회가 있겠지?”라는 희망도 있었습니다. (물론 자대 배치 이후의 현실은 그렇게 간단하지 않았지만요. &lt;a href=&quot;https://shinkeonkim.com/posts/army-memoir/&quot;&gt;군 복무 이야기&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id=&quot;전역-후-다시-그렙으로-복직--그리고-또-한-번의-고민&quot;&gt;전역 후, 다시 그렙으로 복직 … 그리고 또 한 번의 고민&lt;/h2&gt;
&lt;p&gt;군 복무를 마치고 2024년 7월, 다시 그렙에 복직했습니다. 이번에는 교육솔루션팀에 합류해 교육 서비스를 개발하는 일을 맡았습니다. 8개월 정도 근무하면서, 안정적인 루틴과 급여 덕분에 편안함을 느꼈지만, 그 편안함 한편에서 &lt;code&gt;“내가 진짜 하고 싶은 건 뭘까?”&lt;/code&gt;라는 고민이 점점 커졌습니다.&lt;/p&gt;
&lt;p&gt;계속해서 새로운 기능을 만드는 데도 점차 흥미를 잃어가고, 동시에 사적인 프로젝트나 지식 탐구에도 예전 같은 열정을 쏟지 못하고 있다는 걸 깨달았습니다. 군대에 가기 전, “나는 성장하고 싶어!”라고 불타올랐던 그 마음이 어딘가 녹슬어버린 느낌이었습니다. 그러다 보니, &lt;code&gt;&quot;알고리즘만 아는 코더&quot;&lt;/code&gt; 시절처럼 정체된 제가 부끄러웠습니다. &lt;code&gt;“안정감만 쫓고 있으면, 결국 제자리걸음 아닌가?”&lt;/code&gt;라는 생각과 후회감이 들었고, 이번에는 스스로를 다시 새로운 환경에 던져 몰아붙여야겠다는 결심을 하게 되었습니다.&lt;/p&gt;
&lt;p&gt;그래서 2025년 2월을 기점으로, 저는 그렙을 떠나 다시 &lt;code&gt;대학으로 복학&lt;/code&gt;하기로 마음먹었습니다. 학교에서 좀 더 이론적인 공부를 보완하고, 새롭게 떠오르는 기술들에 집중해보고 싶습니다. 그 이후, 또 새로운 곳에 뛰어들어 가보고 싶습니다.&lt;/p&gt;
&lt;p&gt;모든 선택에는 리스크가 따르지만, 지금이 아니면 안 될 것 같습니다. 물론 이 선택이 나중에 후회로 남을 수도 있습니다. 하지만 지금 이 시점에서 &lt;code&gt;“기회비용을 감수하면서도 성장을 택하겠다”&lt;/code&gt;라는 다짐이, 오히려 저에겐 강력한 동력이 될 것 같다는 생각이 듭니다.&lt;/p&gt;
&lt;h2 id=&quot;떠남은-끝이-아니라-또-다른-도약&quot;&gt;떠남은 끝이 아니라 또 다른 도약&lt;/h2&gt;
&lt;p&gt;저는 아직도, 계속해서 제 자신을 &lt;code&gt;“부족한 개발자”&lt;/code&gt;라고 생각합니다.&lt;/p&gt;
&lt;p&gt;특별히 잘하는 한 분야가 확고하게 잡혀 있는 것도 아니고, 일에 완전히 몰입하는 것도 잠시 주춤했던 때가 있었습니다.
그럼에도 &lt;code&gt;&quot;스스로를 몰아붙이고, 낯선 환경에서 새로운 경험에 뛰어드는 것&quot;&lt;/code&gt; 만큼은 잘한다고 단언할 수 있습니다.&lt;/p&gt;
&lt;p&gt;이번 결정이 누군가에게는 이해되지 않을 수도 있고, 저조차 훗날 후회할지 모릅니다. 하지만 그 후회조차도 분명 저를 더 나은 길로 이끄는 &lt;code&gt;&quot;새로운 동기부여&quot;&lt;/code&gt;가 될 것이라 믿습니다.&lt;/p&gt;
&lt;p&gt;그렙에서 함께했던 동료들, 그리고 프로그래머스를 통해 만났던 많은 분들께 감사 인사를 전합니다.
&lt;code&gt;&quot;새로운 도전에 뛰어들려는 지금 이 순간&quot;&lt;/code&gt;이 훗날 제가 더 큰 성장을 할 시작점이 되리라 믿습니다.&lt;/p&gt;
&lt;p&gt;감사합니다.&lt;/p&gt;</content:encoded><category>회고록</category><category>그렙</category><category>프로그래머스</category><author>koa (김신건)</author></item><item><title>Atcoder Beginner Contest 394 후기</title><link>https://shinkeonkim.com/posts/atcoder/2025-02-23-abc-394/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/atcoder/2025-02-23-abc-394/</guid><description>2025년 2월 22일에 진행된 Atcoder Beginner Contest 394에서 풀이한 문제들과 풀이 방법, 그리고 대회 경험을 공유하는 후기입니다.</description><pubDate>Sun, 23 Feb 2025 05:00:00 GMT</pubDate><content:encoded>&lt;h1 id=&quot;개요&quot;&gt;개요&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc394&quot;&gt;대회 링크&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;어제 (2/22) 저녁 9시부터 10시 40분까지 진행된 [[Atcoder]] Beginner Contest 394 후기입니다.&lt;/p&gt;
&lt;p&gt;총 7문제 중 5문제를 풀었습니다.
A ~ D까지 4문제는  대회 시작후 13분 안에 풀이했지만 E번 정확한 풀이를 생각해내는데 60분을 썼고, F번 문제를 읽고 끝났습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc394/editorial&quot;&gt;공식 에디토리얼 (해설)&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;풀이&quot;&gt;풀이&lt;/h1&gt;
&lt;h2 id=&quot;a---22222&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc394/tasks/abc394_a&quot;&gt;A - 22222&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;단순히 주어지는 숫자 문자열에서 2의 개수만큼 다시 2를 출력하는 문제입니다.
빠르게 구현하면 됩니다.&lt;/p&gt;
&lt;h2 id=&quot;b---cat&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc394/tasks/abc394_b&quot;&gt;B - cat&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;주어지는 문자열을 문자열의 길이를 기준으로 정렬 후 차례대로 붙여 출력하는 문제입니다.
빠르게 구현하면 됩니다.&lt;/p&gt;
&lt;h2 id=&quot;c---debug&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc394/tasks/abc394_c&quot;&gt;C - Debug&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;주어지는 문자열에서 WA 라는 문자열을 AC 라는 문자열로 계속해서 대체할 때, 최종 문자열을 구하는 문제입니다.&lt;/p&gt;
&lt;p&gt;예를 들어, WWA 라는 문자열이 있으면 WWA → WAC → ACC 로 변합니다.&lt;/p&gt;
&lt;p&gt;저는 단순히 처음에는 스택을 활용할까 생각했지만, 문자가 변하는 양상을 보니 &lt;code&gt;W*X개+A*1개 &lt;/code&gt; 의 형태를 갖춰야만 바뀐다는 걸 캐치하고, W의 개수를 세다가 A 문자가 등장하면 대체하는 식으로 코드를 구성했습니다.&lt;/p&gt;
&lt;h2 id=&quot;d---colorful-bracket-sequence&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc394/tasks/abc394_d&quot;&gt;D - Colorful Bracket Sequence&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;전형적인 안정적인 괄호 문자열 문제입니다. 다만, 괄호의 종류를 (), &amp;#x3C;&gt;, [] 로 해두었습니다.
따라서, 관련 처리를 하면서 스택으로 해결하면 됩니다.&lt;/p&gt;
&lt;h2 id=&quot;e---palindromic-shortest-path&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc394/tasks/abc394_e&quot;&gt;E - Palindromic Shortest Path&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;그래프가 주어집니다. 단, 정점이 아닌 “간선”마다 문자가 기록되어 있는 그래프입니다.
이때 모든 정점 사이의 페어마다, 간선의 문자열을 나열해서 팰린드롬이 되도록 하는 경로의 최소 길이를 구해야 합니다.&lt;/p&gt;
&lt;p&gt;처음에 저는 BFS로 정점마다 출발하여 팰린드롬인지 파악하는 완전탐색으로도 1억 내외로 연산 수가 떨어지면 시간안에 들지 않을까라는 생각으로 트라이했습니다. 하지만 TLE가 나왔고, 다른 방법을 생각해야 했습니다.&lt;/p&gt;
&lt;p&gt;이때 굳이 간선의 정보가 주어지고 있는데, 정점 기준으로 탐색할 필요가 있을까 생각이 들었습니다.
그래서 모든 간선은 일단 문자가 1개로 구성된 팰린드롬이고, 양 옆에 같은 문자를 이어 붙이면 팰린드롬이 되지 않을까 라는 생각으로 알고리즘을 구성했습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;먼저 정방향 간선 정보와 역방향 간선 정보를 저장한다.&lt;/li&gt;
&lt;li&gt;모든 간선을 큐에 넣는다. (해당 간선은 길이가 1인 팰린드롬이기 때문에, { 시작점, 끝점, 길이=1 }) 와 같이 넣는다.&lt;/li&gt;
&lt;li&gt;아래에서 설명 추가 과정 필요&lt;/li&gt;
&lt;li&gt;큐의 맨 앞에 있는 간선에서 정방향 간선 정보와 역방향 간선 정보를 참조해, 앞 뒤로 같은 문자을 붙일 수 있느지, 붙일 수 있다면 그것이 현재 최소 길이인지 확인해서 갱신 후 큐에 다시 넣는다.&lt;/li&gt;
&lt;li&gt;갱신된 모든 길이를 출력한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이 방법의 이점은 일단 간선의 정보만 다룬다는 것이고, 만들어진 문자열들이 팰린드롬인지를 체크할 필요가 없다는 것입니다.&lt;/p&gt;
&lt;p&gt;그리고 이 방식은 홀수 길이인 경우만 알아낼 수 있는데 따라서 3번 과정에서 모든 i에 대해  i → i 로 가는 가상의 경로에 현재까지의 팰린드롬 길이가 0이다를 집어넣어놓으면 됩니다. { 출발점=i, 끝점=i, 길이=0} 과 같이 말입니다.&lt;/p&gt;
&lt;h2 id=&quot;f---alkane&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc394/tasks/abc394_f&quot;&gt;F - Alkane&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;그래프 정보가 주어집니다.
이때 아래 조건을 만족하는 부분 그래프의 최대 크기를 구합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;해당 그래프는 무향 그래프다.&lt;/li&gt;
&lt;li&gt;모든 정점의 차수는 1 또는 4이다. (해당 정점에 이어지는 간선 수)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;딱히 떠오르는 해답이 없었습니다…&lt;/p&gt;
&lt;h2 id=&quot;g---dense-buildings&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc394/tasks/abc394_g&quot;&gt;G - Dense Buildings&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;문제조차 읽지 못했습니다.&lt;/p&gt;
&lt;h1 id=&quot;결론&quot;&gt;결론&lt;/h1&gt;
&lt;p&gt;7문제 중 5문제를 풀이하면서 점차 예전의 실력을 되찾아가는 느낌이 들었습니다.
언젠가 모든 문제를 막힘없이 자연스럽게 다 푸는 실력까지 도달하고 싶습니다.&lt;/p&gt;</content:encoded><category>atcoder</category><category>문제풀이</category><author>koa (김신건)</author></item><item><title>2022년 11월부터 시작된 1년 6개월 회고록</title><link>https://shinkeonkim.com/posts/my-life/2024-05-28-army-memoir/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/my-life/2024-05-28-army-memoir/</guid><description>군대에서의 1년 6개월을 돌아보며, 그 기간 동안의 공부와 앞으로의 계획에 대해 정리한 회고록입니다.</description><pubDate>Tue, 28 May 2024 06:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;길면서 짧았던 군 생활을 마무리하며, 회고록을 작성한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;서론&quot;&gt;서론&lt;/h2&gt;
&lt;p&gt;2022년 11월 28일, 논산 훈련소로 입대했습니다.&lt;/p&gt;
&lt;p&gt;같이 오신 부모님과 되게 쿨한 작별 인사를 하고, 터벅 터벅 들어갔습니다. 이전에는 입소식도 했다고 하지만, 저는 코로나 막바지라 그런 행사 없이 바로 입소 관련 절차를 시작했습니다.&lt;/p&gt;
&lt;p&gt;훈련소 내에서도 여러 일이 있었지만.. 시간이 바로 흘러 어느덧 수료식이었습니다. 수료식이 끝나고 부모님과 외출/면회를 하면서 저의 자대 배치 결과를 확인했습니다.&lt;/p&gt;
&lt;p&gt;특전사령부.&lt;/p&gt;
&lt;p&gt;????????? 저는 굉장히 당황스러웠고, &lt;code&gt;왜? 내가 어째서? 이게 맞아?&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;일단 특전사령부는 어디있지 하고 찾아보았고, 경기도 이천에 있다는 것을 확인했습니다. 와, 그래도 집 앞에 있는 부대로 가는구나 싶어서 신났습니다. (본가가 이천입니다)&lt;/p&gt;
&lt;p&gt;그렇게 외출에서 복귀하고 자대 배치일을 기다려서, 그날이 왔습니다.&lt;/p&gt;
&lt;p&gt;하지만 뭔가 이상했습니다. 이천으로 가는 길이라고 하기엔 너무 멀었고, 담당 간부님은 제가 전남 담양으로 간다고 말씀하셨습니다. 거기는 어디지..? 하고 물어보니 11공수특전여단이었고, 특전사령부의 예하 여단으로 가는 것이었습니다. &lt;code&gt;아.. 예하 부대는 표기가 안되는 거였구나&lt;/code&gt; 싶었고, 그렇게 전남 담양에서의 군 생활이 시작되었습니다.&lt;/p&gt;
&lt;p&gt;자대 배치 후, 군 생활이 새로 시작되었다 할만큼 굉장히 많은 업무와 생활 룰(?)을 배웠고, 숙지했습니다.&lt;/p&gt;
&lt;p&gt;그 이후, 여러 훈련도 하고, 업무/공부/운동을 반복하다 보니 1년 반이 흘렀습니다. (자세한 내용은 스킵. 알고 싶으면 술 사주면서…ㅎㅎ)&lt;/p&gt;
&lt;p&gt;이제 한번 어떤 걸 공부했었는지 정리해보려 합니다. (군 관련 내용은 일부러 안 적었습니다.)&lt;/p&gt;
&lt;h2 id=&quot;군대에서-공부하기&quot;&gt;군대에서 공부하기&lt;/h2&gt;
&lt;h3 id=&quot;자격증을-땄다&quot;&gt;자격증을 땄다.&lt;/h3&gt;
&lt;p&gt;네트워크관리사 2급 자격증을 군생활 막바지에 땄습니다.&lt;/p&gt;
&lt;p&gt;사실 필기 시험은 진작에 통과했었습니다. &lt;code&gt;나중에 따야지..따야지&lt;/code&gt; 하다가 막바지에 진짜 이제는 해야한다는 생각을 가지고 나중에서야 땄습니다..&lt;/p&gt;
&lt;p&gt;그리고 전역 이틀 전에 SQLD 시험을 응시했고, 아마.. 합격이지 않을까 생각합니다.&lt;/p&gt;
&lt;h3 id=&quot;백준-문제라도-풀자&quot;&gt;백준 문제라도 풀자.&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://shinkeonkim.com/img/posts/2024/05/28/Untitled.png&quot; alt=&quot;Untitled&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://shinkeonkim.com/img/posts/2024/05/28/Untitled%201.png&quot; alt=&quot;Untitled&quot;&gt;&lt;/p&gt;
&lt;p&gt;입대 전(2451문제) → 24.05.01(4034문제)로 약 1500문제 이상을 풀었습니다.  그리고 군생활 도중에 다이아5에서 다이아4로도 승급했습니다.&lt;/p&gt;
&lt;p&gt;뭐.. 최대한 많은 문제와 할 수 있는 공부는 다 해보자라는 생각으로 계속 했던 것 같습니다. 그 덕분에 시간도 금방 간 것 같습니다.&lt;/p&gt;
&lt;h3 id=&quot;강의를-듣자&quot;&gt;강의를 듣자.&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://code.plus&quot;&gt;code.plus&lt;/a&gt; 사이트(스타트링크)에서 제공하는 알고리즘 고급으로 가는 연결고리 강의를 들었습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://shinkeonkim.com/img/posts/2024/05/28/code.plus_course_47_certification.png&quot; alt=&quot;code.plus_course_47_certification.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://shinkeonkim.com/img/posts/2024/05/28/b08e135b-b20b-4809-8f51-c043a0f6860f.png&quot; alt=&quot;code.plus_course_46_certification.png&quot;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;인프런 - &lt;a href=&quot;https://www.inflearn.com/course/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%95%B5%EC%8B%AC%EC%9D%B4%EB%A1%A0-%EA%B8%B0%EC%B4%88/dashboard&quot;&gt;외워서 끝내는 네트워크 핵심 이론 - 기초&lt;/a&gt;, &lt;a href=&quot;https://www.inflearn.com/course/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%95%B5%EC%8B%AC%EC%9D%B4%EB%A1%A0-%EC%9D%91%EC%9A%A9/dashboard&quot;&gt;외워서 끝내는 네트워크 핵심 이론 - 응용&lt;/a&gt; 강의를 수강했습니다. 네트워크 관리사 자격증을 따면서 더 좋은 지식을 얻을 수 있을까 싶어 강의를 들었습니다. 상당히 좋은 강의였고 추천합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://shinkeonkim.com/img/posts/2024/05/28/Untitled%202.png&quot; alt=&quot;Untitled&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://shinkeonkim.com/img/posts/2024/05/28/Untitled%203.png&quot; alt=&quot;Untitled&quot;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;인프런 - &lt;a href=&quot;https://www.inflearn.com/course/%EC%99%B8%EC%9B%8C%EC%84%9C-%EB%81%9D%EB%82%B4%EB%8A%94-%EC%95%94%ED%98%B8%EA%B8%B0%EC%88%A0/dashboard&quot;&gt;외워서 끝내는 SSL과 최소한의 암호기술&lt;/a&gt; 강의를 수강했습니다. 위 네트워크 강의와 이어지는 부분이 많았고, 아직도 다시 찾아보면서 내용을 흡수하고 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://shinkeonkim.com/img/posts/2024/05/28/Untitled%204.png&quot; alt=&quot;Untitled&quot;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;생활 코딩 - &lt;a href=&quot;https://www.inflearn.com/course/%EC%83%9D%ED%99%9C%EC%BD%94%EB%94%A9-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D/dashboard&quot;&gt;정규표현식&lt;/a&gt;, &lt;a href=&quot;https://www.inflearn.com/course/web2-oauth2/dashboard&quot;&gt;Web2 : Oauth 2.0&lt;/a&gt; 강의를 수강했습니다. 이전부터 조금씩 내가 제대로 알고 있는 게 맞나 싶었던 부분을 긁어주었던 강의였습니다. 전역 후 다시 TIL 글로 정리해보려고 합니다.&lt;/li&gt;
&lt;li&gt;인프런 - &lt;a href=&quot;https://www.inflearn.com/course/sync-async-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4/dashboard&quot;&gt;[그림으로 이해하는] 동기 비동기의 개념에 대한 가장 직관적인 이해&lt;/a&gt;라는 강의를 수강했습니다. 사실 거의 아는 내용이 나왔고, 조금 아쉬웠습니다. 차라리 이 강의를 몇 년 전에 비동기에 대한 이해가 없었을 때 봤다면 더 좋았겠다 싶습니다.&lt;/li&gt;
&lt;li&gt;인프런 - &lt;a href=&quot;https://www.inflearn.com/course/mastering-svg/dashboard&quot;&gt;SVG 마스터&lt;/a&gt; 강의를 수강했습니다. 뭔가 유익했지만 군대라는 현실에 실습을 거의 못해봤습니다. 조금 아쉽기에 이걸 활용한 사이드 프로젝트를 진행할 수 있을까 고민해봅니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;앞으로는-뭘-하지&quot;&gt;앞으로는 뭘 하지?&lt;/h2&gt;
&lt;p&gt;남은 2024년 동안에는 아래 목표를 하나씩 차근차근 해보려 합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;일간 목표&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;아침 또는 저녁마다 운동을 한다. (안 되면 산책이라도)&lt;/li&gt;
&lt;li&gt;매일 백준 문제 풀기 (적어도 1문제)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;월간 목표&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;적어도 2권의 책을 읽는다. (종류 상관 X)&lt;/li&gt;
&lt;li&gt;매주 일요일 혹은 매달 마지막에 무엇을 했는지 간단하게 정리하자.&lt;/li&gt;
&lt;li&gt;TIL Repo에 꾸준히 기록물을 남긴다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;연간 목표&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;회사를 재밌게 다닌다.&lt;/li&gt;
&lt;li&gt;연간 백준 500 AC를 도전한다.&lt;/li&gt;
&lt;li&gt;자격증 / 운전 면허증 등의 자격증을 꾸준히 딴다.&lt;/li&gt;
&lt;li&gt;Codeforces / Atcoder Contest에 주기적으로 참여한다. (Blue를 계속 유지할 수 있는 실력이 될 수 있도록)&lt;/li&gt;
&lt;li&gt;Kaggle을 시작한다.&lt;/li&gt;
&lt;li&gt;간단한 사이드 프로젝트를 적어도 2개 진행한다.&lt;/li&gt;
&lt;li&gt;Spring과 K8s를 공부한다.&lt;/li&gt;
&lt;li&gt;재미있는 자취 생활을 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;아무튼&quot;&gt;아무튼&lt;/h2&gt;
&lt;p&gt;드디어 끝났습니다.&lt;/p&gt;
&lt;p&gt;제가 거창하게 나라를 지켰다고는 못하겠습니다.&lt;/p&gt;
&lt;p&gt;저는 누군가가 계속 이어서 지켜오던 한 자리를 지켰고, 자리를 지키는 것 만큼은 최선을 다했다 생각합니다.&lt;/p&gt;
&lt;p&gt;저는 앞으로 좀 더 다양한 경험을 사회에서 하면서 저의 길을 다시 걸어 가보겠습니다.&lt;/p&gt;
&lt;p&gt;지금까지, 그리고 앞으로 나라와 각자의 자리를 지켜주시는 군인 여러분 감사합니다.&lt;/p&gt;
&lt;p&gt;단결.&lt;/p&gt;</content:encoded><category>회고록</category><category>군대</category><author>koa (김신건)</author></item><item><title>[BOJ] 16496 큰 수 만들기</title><link>https://shinkeonkim.com/posts/problem-solving/boj/2023-09-20-boj-19496/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/problem-solving/boj/2023-09-20-boj-19496/</guid><description>야간 당직을 서면서 직접 숫자를 만들어 나열해가다가, 아이디어가 떠올랐다.</description><pubDate>Wed, 20 Sep 2023 14:03:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;문제-요약-및-풀이&quot;&gt;문제 요약 및 풀이&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/16496&quot;&gt;16496번: 큰 수 만들기&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;야간 당직을 서면서 직접 숫자를 만들어 나열해가다가, 아이디어가 떠올랐다.&lt;/p&gt;
&lt;p&gt;임의의 어떤 수 A와 B가 있을 때, 두 수를 합친 AB와 BA가 있다면,
그 두 수중 큰 숫자를 선택하는 상황이다.&lt;/p&gt;
&lt;p&gt;그럼 점차 합쳐지는 과정에서도 똑같은 규칙이 적용되는 것이니, 정렬을 해당 기준으로 하고
나중에 합치면 되지 않을까?&lt;/p&gt;
&lt;h3 id=&quot;풀이시에-주의하기&quot;&gt;풀이시에 주의하기…&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;ull 타입 사용하기, 오버플로우 주의&lt;/li&gt;
&lt;li&gt;0000…000 은 0 이다. 문제조건을 잘 읽자.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;풀이-코드&quot;&gt;풀이 코드&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#include&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;#x3C;bits/stdc++.h&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;using&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; namespace&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#define&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; e; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; unsigned&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ull;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ull ar[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ull&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; zero&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ull&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ull ret &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ret &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ret;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;bool&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; compare&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ull&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ull&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; b&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ull x &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; zero&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(b) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ull x2 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; zero&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(x &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; x2) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; solve&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, N) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ar[i];    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  sort&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(ar, ar&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;N, compare);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(ar[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, N) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ar[i];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  ios&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sync_with_stdio&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  cin.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tie&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;NULL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);cout.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tie&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;NULL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; tc &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt; // cin &gt;&gt; tc;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(tc&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;solve&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded><category>BOJ</category><category>PS</category><category>Sorting</category><author>koa (김신건)</author></item><item><title>[BOJ] 16940 BFS 스페셜 저지</title><link>https://shinkeonkim.com/posts/problem-solving/boj/2023-09-10-boj-16940/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/problem-solving/boj/2023-09-10-boj-16940/</guid><description>트리가 주어지고, 노드들을 탐색한 순서가 주어진다. 이때, 탐색한 순서가 BFS 탐색으로 가능한 순서가 맞는지 검증하면 된다.</description><pubDate>Sun, 10 Sep 2023 04:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;문제-요약-및-풀이&quot;&gt;문제 요약 및 풀이&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/16940&quot;&gt;16940번: BFS 스페셜 저지&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;트리가 주어지고, 노드들을 탐색한 순서가 주어진다.
이때, 탐색한 순서가 BFS 탐색으로 가능한 순서가 맞는지 검증하면 된다.&lt;/p&gt;
&lt;p&gt;처음에는 정말 단순하게 접근했다.&lt;/p&gt;
&lt;p&gt;그냥 BFS 탐색을 한번 돌면서, level graph를 만들고, level graph 상에서의 level이 비내림차순으로 배치되었는가만 봤다.&lt;/p&gt;
&lt;p&gt;하지만, 역시나 바로 WA를 받았다. (생각을 좀 하고 풀라고…)&lt;/p&gt;
&lt;p&gt;문제가 뭘까 생각중에 아래 예제를 질문 게시판에서 봤다.&lt;/p&gt;
&lt;img src=&quot;https://shinkeonkim.com/img/posts/2023/09/10/boj_16940_1.png&quot;&gt;
&lt;p&gt;이 경우에는 12354 또는 13245만 가능한데, 2 또는 3을 방문하는 순서에 따라 4 와 5의 방문순서가 결정되기 때문이다.
따라서, 12345와 같은 방문 순서가 불가능해진다.&lt;/p&gt;
&lt;p&gt;그렇기 때문에 위에서 생각한 level graph로 판단하는 건 불가능하다.&lt;/p&gt;
&lt;p&gt;그래서 결국 주어지는 순서대로 BFS 방문을 직접 해보는데, 다음노드로 넘어갈 때의 순서를
주어진 순서를 참고하여 탐색해보는 방법을 사용했다.&lt;/p&gt;
&lt;h2 id=&quot;풀이-코드&quot;&gt;풀이 코드&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#include&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;#x3C;bits/stdc++.h&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#define&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#define&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; for1j&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n; j&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;using&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; namespace&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pair &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pii;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;int&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; edges[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;110000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; order[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;110000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;bool&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; chk[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;110000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  ios&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sync_with_stdio&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	cin.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tie&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	cout.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tie&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;	for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, N &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a, b;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		edges[a].&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(b);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		edges[b].&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;	for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, N) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		order[a] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	queue&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;int&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Q;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	Q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;	int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; crt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;	while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;empty&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; f &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;front&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); Q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pop&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(crt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; order[f]) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;			cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;			return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		chk[f] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		crt&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		vector &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;pii&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nxt : edges[f]) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;			if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(chk[nxt]) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;continue&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;			&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;			v.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ order[nxt], nxt });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;		sort&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(v.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(), v.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;auto&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nxt : v) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;			Q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(nxt.second);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded><category>BOJ</category><category>PS</category><category>DP</category><author>koa (김신건)</author></item><item><title>[BOJ] 2618 경찰차</title><link>https://shinkeonkim.com/posts/problem-solving/boj/2023-05-27-boj-2618/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/problem-solving/boj/2023-05-27-boj-2618/</guid><description>이때, 두 경찰차가 이동하는 최소 거리를 구해야 한다.</description><pubDate>Sat, 27 May 2023 09:23:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;문제-요약-및-풀이&quot;&gt;문제 요약 및 풀이&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2618&quot;&gt;2618번: 경찰차&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1. 두 경찰차가 모든 사건을 처리하러 이동해야 한다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2. 모든 사건을 주어지는 순서대로 처리해야 한다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3. 두 경찰차는 처음에 각각 (1, 1), (N, N)에 위치한다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이때, 두 경찰차가 이동하는 최소 거리를 구해야 한다.&lt;/p&gt;
&lt;p&gt;일단 먼저 모든 경우를 탐색한다고 생각해보고 접근해보자.
사건의 개수는 C개 (&amp;#x3C;= 1000)이다.&lt;/p&gt;
&lt;p&gt;그럼 사건을 두 경찰차가 각각 배정받게 만들고, 이를 계산을 순서대로 해본다고 하자.
시간복잡도는 2^C 가 되며, 문제의 최대 범위로 입력이 들어올 경우 최대 2^1000 만큼 연산해야 한다.&lt;/p&gt;
&lt;p&gt;무조건 시간초과가 뜰 것이다.&lt;/p&gt;
&lt;p&gt;생각을 간단히 해보자.&lt;/p&gt;
&lt;p&gt;만약에 첫번째 경찰차가 2번째 사건까지 처리하고,
두번째 경찰차가 4번째 사건까지 어찌저찌 처리했다 해보자.&lt;/p&gt;
&lt;p&gt;그럼 다음으로 처리해야 하는 사건은 어떤 사건인가?&lt;/p&gt;
&lt;p&gt;당연하게도 5번째 사건을 처리해야 한다.&lt;/p&gt;
&lt;p&gt;왜? 바로 순서대로 사건을 처리해야 한다는 조건때문이다.&lt;/p&gt;
&lt;p&gt;이 점을 이용해서 DP 식에 넣고 이용해보자.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;i는 첫번째 경찰차의 마지막 위치라하고&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;j는 두번째 경찰차의 마지막 위치라 할 때&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;DP[i][j] = 두 경찰차가 이동한 최소 거리라 하자.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;단, i와 j는 같을 수 없다. (i와 j가 같다는 것은 두 경찰차가 같은 사건을 처리했다는 의미이므로 배제해야 한다.)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;DP[i][j] 를 이용해서 알아낼 수 있는 값은 어떤 것이 있을까?&lt;/p&gt;
&lt;p&gt;첫번째 경찰차 또는 두번째 경찰차가 이동하는 경우일테니 아래와 같을 것이다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 첫번째 경찰차가 이동한 경우&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nxt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; max&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(i, j) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;DP[nxt][j]] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; DP[i][j] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dis&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(points[i], points[nxt]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 두번쨰 경찰차가 이동한 경우&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nxt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; max&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(i, j) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;DP[i][nxt]] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; DP[i][j] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dis&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(points[j], points[nxt]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;풀이-코드&quot;&gt;풀이 코드&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#include&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;#x3C;bits/stdc++.h&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#define&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#define&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; for1j&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n; j&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#define&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; foreach&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;k&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;auto&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i : k)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#define&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; foreachj&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;k&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;auto&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; j : k)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#define&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; pb&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#define&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; sz&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) a.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#define&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; INF&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 100000000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;using&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; namespace&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; unsigned&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ull;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ll;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; vector &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;int&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; iv1;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; vector &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;int&gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; iv2;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; vector &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ll&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; llv1;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; unsigned&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; uint&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; vector &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ull&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ullv1;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; vector &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;vector &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ull&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ullv2;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Point&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;	int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; y, x;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; st&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	Point p;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	Point rev;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;	int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cost;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; cmp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    bool&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; operator&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;st&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;st&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; b&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;){&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a.cost &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b.cost;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; C;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Point points[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; D[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Point back[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dis&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Point&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Point&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; b&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;	return&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; abs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a.x &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b.x) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; abs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a.y &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b.y);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  ios&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sync_with_stdio&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	cin.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tie&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	cout.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tie&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; C;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;	for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; C &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; C &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; j&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) D[i][j] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; INF;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	points[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	points[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {N, N};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;	for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; C &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; points[i].y &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; points[i].x;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	priority_queue &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;st, vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;st&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, cmp&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; q;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ {&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}, {&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;	while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;empty&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		st here &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pop&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; y &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; here.p.y;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; x &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; here.p.x;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(D[y][x] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; here.cost) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;continue&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		D[y][x] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; here.cost;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		back[y][x] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; here.rev;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nxt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; max&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(y, x) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(nxt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; C &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;continue&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ {y, nxt}, here.p, here.cost &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dis&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(points[x], points[nxt])});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ {nxt, x}, here.p, here.cost &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dis&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(points[y], points[nxt])});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	stack &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Point&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; stk;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;	int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ans &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; INF;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	Point s;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;	for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; C &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(D[i][C &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ans) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;			ans &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; D[i][C &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;			s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {i, C &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(D[C&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ans) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;			ans &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; D[C &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][i];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;			s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {C &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, i};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ans &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;	while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s.x &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s.y &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		stk.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; back[s.y][s.x];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;	while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;stk.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;empty&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		Point here &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; stk.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		stk.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pop&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(stk.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;empty&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;continue&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		Point there &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; stk.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(here.x &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; there.x) cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded><category>BOJ</category><category>PS</category><category>DP</category><author>koa (김신건)</author></item><item><title>2년차 주니어 개발자 / 휴학생 / 예비 군인의 미리 쓰는 2022년 회고록</title><link>https://shinkeonkim.com/posts/my-life/2022-10-30-goodbye-2022/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/my-life/2022-10-30-goodbye-2022/</guid><description>2년차 주니어 개발자, 휴학생, 예비 군인 등 많은 수식어가 생긴 올해의 회고록은 일찍 써보려 한다.</description><pubDate>Sun, 30 Oct 2022 07:05:00 GMT</pubDate><content:encoded>&lt;style&gt;
  img.align-left {
    position: relative;
    left: 0%;
    tranform: none;
  }
&lt;/style&gt;
&lt;blockquote&gt;
&lt;p&gt;2년차 주니어 개발자, 휴학생, 예비 군인 등 많은 수식어가 생긴 올해의 회고록은 일찍 써보려 한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;img src=&quot;https://shinkeonkim.com/img/salute.png&quot; width=&quot;400&quot;&gt;
&lt;h2 id=&quot;서론&quot;&gt;서론&lt;/h2&gt;
&lt;h3 id=&quot;이-회고록은-왜-일찍-쓰여지는-걸까&quot;&gt;이 회고록은 왜 일찍 쓰여지는 걸까?&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://shinkeonkim.com/posts/goodbye-2021/&quot;&gt;작년 회고록&lt;/a&gt; 에서도 언급되었지만, 군대를 가야 합니다.&lt;/p&gt;
&lt;p&gt;최대한 올해가 가기전에 입대를 하기 위해, 두 번이나 SW 개발병에 지원을 했었지만, 첫번째는 면접에서 탈락, 두번째는 서류에서 탈락했습니다.&lt;/p&gt;
&lt;p&gt;아무래도 SW 개발병 점수에 포함되는 학력 점수가 영향을 많이 줬지 않았을까 생각하고 있습니다… (휴학을 너무 빨리 했습니다 ㅠ)&lt;/p&gt;
&lt;p&gt;아무튼, SW 개발병으로 개발을 하면서 군대 생활을 하기엔 힘들겠다 판단했고, 기술행정병으로 지원했고 정보체계운용/정비 특기로 11월 28일에 입대합니다.&lt;/p&gt;
&lt;p&gt;11월 언저리 넘어서야 &lt;code&gt;올해 회고록 좀 써볼까&lt;/code&gt; 해왔었지만, 올해는 좀 서둘러봅니다.&lt;/p&gt;
&lt;h3 id=&quot;올해는-큰-변화가-있었을까&quot;&gt;올해는 큰 변화가 있었을까?&lt;/h3&gt;
&lt;p&gt;솔직히 큰 변화는 없던 한해 같습니다.&lt;/p&gt;
&lt;p&gt;매일 아침 일어나 리모트 근무를 시작하고, 업무 시간이 끝나면 저녁을 먹고 독서 / 알고리즘 공부 / 유튜브 또는 넷플릭스 보기만 반복을 했던 것 같습니다.&lt;/p&gt;
&lt;p&gt;어쩌면 2년동안 반복되는 생활에 큰 변화를 주면서, 언젠가는 해야 하는 의무를 다하기 위해 올해가 가기전에 입대를 하기로 한 것 같습니다.&lt;/p&gt;
&lt;h2 id=&quot;올해는-뭘하며-지낸걸까&quot;&gt;올해는 뭘하며 지낸걸까?&lt;/h2&gt;
&lt;h3 id=&quot;회사-업무는-끝이-없었다&quot;&gt;회사 업무는 끝이 없었다.&lt;/h3&gt;
&lt;p&gt;JIRA 사이트에서 올해 내가 맡았던 이슈들 개수를 뽑았을 때 총 290개(2022.10.12 기준)가 나왔습니다…&lt;/p&gt;
&lt;p&gt;처음에 뽑고나서 이렇게까지 많이 했었나? 라는 생각이 들었지만, 한번씩 제목들을 살펴봤더니 모두 기억에 남아있는 내용들이었습니다.&lt;/p&gt;
&lt;p&gt;그 중에 기억에 남는 업무들을 간접적으로 나열해보고자 합니다.&lt;/p&gt;
&lt;h4 id=&quot;1-어쩌다보니-실험실이-된-프로젝트&quot;&gt;1. 어쩌다보니 실험실이 된 프로젝트&lt;/h4&gt;
&lt;p&gt;다른 서비스에서 제공하는 API를 활용해야 하는 업무가 있었습니다. 근데 해당 서비스에서 제공하는 API는..&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;여러 복잡한 과정들을 거쳐서 값을 복호화 / 암호화해야 했습니다.&lt;/li&gt;
&lt;li&gt;우리 부서만 사용하는게 아니었습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;그래서 결국 해당 API를 한번 걸러서 간편하게 사용할 수 있는 서버리스 프로젝트를 만들기로 했습니다.&lt;/p&gt;
&lt;p&gt;그렇게 해당 프로젝트를 활용할 부서들에서 사람들이 모여서 개발을 시작했습니다.&lt;/p&gt;
&lt;p&gt;해당 프로젝트를 진행하기 위해 여러 기술 / 인프라들이 합쳐지기 시작했는데,,,&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Python&lt;/code&gt;, &lt;code&gt;Flask&lt;/code&gt;, &lt;code&gt;Docker(docker-compose)&lt;/code&gt;, &lt;code&gt;DynamoDB&lt;/code&gt;, &lt;code&gt;AWS ECR&lt;/code&gt;, &lt;code&gt;AWS Lambda&lt;/code&gt;, &lt;code&gt;AWS API Gateway&lt;/code&gt;, &lt;code&gt;Terraform&lt;/code&gt; 등&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python과 Flask&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;개발 자체는 Python과 Flask 프레임워크를 사용했습니다. (개발을 같이 하는 동료들의 주 언어가 대부분 Python 이었고, 간편하고 빠르게 개발할 수 있을 거라 생각했습니다.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Terraform&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;그리고 해당 프로젝트의 인프라를 구성할 때, 가장 먼저 고려한 건 &lt;a href=&quot;https://www.terraform.io/&quot;&gt;Terraform&lt;/a&gt; 이었습니다.&lt;/p&gt;
&lt;p&gt;Terraform을 이용해 기본적인 VPC 부터 Lambda까지 모든 인프라를 구성하기로 했습니다. 사내에서 여러 프로젝트 인프라들이 Terraform으로 구성되고 있던 추세였고, 사용성이 나쁘지 않다고 생각되어서 도입을 하기로 했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AWS Lambda에 .zip 파일을 이용하여 배포하는 방식이 아니라,&lt;/p&gt;
&lt;p&gt;Docker Container Image를 빌드하고, 해당 Image를 AWS ECR에 올린 후에, AWS Lambda에서 해당 이미지를 가져다가 구동하는 방식으로 배포하려 했기 때문에 Docker를 도입했습니다.&lt;/p&gt;
&lt;p&gt;물론, 개발 과정 중 서버를 띄우는 등에서의 편리함이나 DynamoDB를 쉽게 로컬에서 테스트하기 위함도 있었습니다.&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;배포 과정 중에 API Gateway에 접근이 안되거나, 리소스 제한 정책, 보안 그룹 등의 설정들이 제대로 파악되지 않아 이슈가 있었습니다만..&lt;/p&gt;
&lt;p&gt;어찌저찌 해결되어 결국 위 기술들이 모두 혼합되어 지금까지 잘 작동하고 있습니다. (자세히 이야기를 남기기엔 애매하네요.. 우리 회사에도 기술블로그 글을 쓴다면.. 할만한 이야기겠네요 ㅎㅎ)&lt;/p&gt;
&lt;p&gt;그리고 추가적인 유지보수 작업들도 잘 이어지고 있는 상황입니다.&lt;/p&gt;
&lt;h4 id=&quot;2-jsonb-컬럼-치워&quot;&gt;2. Jsonb 컬럼 치워!&lt;/h4&gt;
&lt;p&gt;DB 테이블 중, 한 테이블에 Jsonb 라는 타입의 컬럼들이 많이 있는 상황이었습니다.&lt;/p&gt;
&lt;p&gt;말 그대로 컬럼에 Json 문자열이 들어가있기 때문에, 빠르게 안에 있는 정보를 파악하거나, DB Query로 통계를 뽑는 등의 작업이 쉽지 않았습니다. (Json 문자열 안에는 배열도 있었고, 2번, 3번이 중첩된 구조도 있었으며, FK 형식의 id값도 들어가있었습니다…)&lt;/p&gt;
&lt;p&gt;Json 문자열 구조가 들어가있다보니, 임의적으로 데이터를 마이그레이션 하기도 쉽지 않았죠.&lt;/p&gt;
&lt;p&gt;언젠가 뜯어고치고 만다! 라는 마음을 가지고 있었는데, 올해가 가기전에 편안하게 처리를 하게 되었습니다.&lt;/p&gt;
&lt;p&gt;하는 방법은 의외로 간단했지만 험난했습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;새로운 테이블 / 모델 생성&lt;/li&gt;
&lt;li&gt;기존의 Jsonb 컬럼에 있는 데이터를 옮기는 마이그레이션 잡 생성&lt;/li&gt;
&lt;li&gt;기존 Jsonb 데이터로 사용하고 있던 “모든 부분”을 찾아내어 새로운 모델로 대체하기&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1번은 그럭저럭 기존 Jsonb 내에있는 내용을 그대로 가져다 쓰는 거기에 큰 이슈는 없었습니다.
2번은 계속해서 써오고 있는 최적화 방법으로 쉽게 해결했습니다. 단순히 Insert 또는 Update하는 것을 쪼개서 실행하는 것이죠.. 마이그레이션하는 대상이
몇 십만개씩이었기 때문에, 한번에 Insert / Update를 하게되어 마이그레이션을 하다가 서버가 힘들어하는 상황을 막으려 했습니다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 임의적으로 모델이나 테이블명을 바꾸었습니다&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;module&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Migrations&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  class&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; MigrateHelloModelJob&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;#x3C; &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ApplicationJob&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    queue_as &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;:default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; perform&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;        max_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; HelloModel&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;maximum&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;:id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;upto&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(max_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10_000&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;each&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; do&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; |i|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;          ActiveRecord&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Base&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;connection&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;execute&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;#x3C;&amp;#x3C;-SQL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.squish&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            INSERT INTO&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; future_hello_models (blah)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            SELECT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; blah &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; hello_models&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            WHERE&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; hello_models&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; #{i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10_000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AND&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; hello_models&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; #{(i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10_000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          SQL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3번은 코드 검색을 더불어서, 지금까지 해당 모델들이 쓰였던 부분들을 다 순회하면서 찾아내어 TODO 코멘트를 붙여놓은 뒤, 다 정리했습니다.&lt;/p&gt;
&lt;p&gt;그리고나서 워낙에 큰 마이그레이션이다 보니, 사용자들이 해당 서비스를 비교적 사용하지 않는 새벽에 점검 화면을 띄우고 배포를 진행하였습니다.&lt;/p&gt;
&lt;h3 id=&quot;해커톤-공모전-그리고-토이-프로젝트들&quot;&gt;해커톤, 공모전 그리고 토이 프로젝트들&lt;/h3&gt;
&lt;p&gt;올해도 마찬가지로 사이드 프로젝트들을 했고, Github 링크와 간단한 설명을 정리하여 남겨보겠습니다.&lt;/p&gt;
&lt;h4 id=&quot;ttl&quot;&gt;TTL&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Velog / 티스토리 / 깃헙 블로그 등에 흩어져 있는 TIL을 모두 모아보는 서비스&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;해당 프로젝트를 하면서, 처음으로 celery를 도입하여 사용해보았습니다.&lt;/p&gt;
&lt;p&gt;하지만 celery 큐를 통해 주기적으로 사용자의 TIL 글들을 동기화하는 job을 돌리는 과정에서,&lt;/p&gt;
&lt;p&gt;서버 리소스의 최적화가 되지 않아 주기적으로 웹서버가 죽는 이슈가 있었습니다. 최대한 job을 나누고, 코드의 최적화를 시도했지만 계속해서 웹서버는 죽었고 결국 해당 기능을 잠시 죽이는 안타까운 백그라운드가 있었습니다&lt;/p&gt;
&lt;p&gt;Github&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/today-they-learned/ttl_front&quot;&gt;https://github.com/today-they-learned/ttl_front&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/today-they-learned/ttl_api&quot;&gt;https://github.com/today-they-learned/ttl_api&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;sellon&quot;&gt;Sellon&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;실시간 중고 상품 경매 서비스&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;실시간성을 위한 API들을 어떻게 만들지에 대한 고민을 많이 한 프로젝트였습니다.&lt;/p&gt;
&lt;p&gt;자세한 내용은 Github README를 참고하면 될 것 같습니다.&lt;/p&gt;
&lt;p&gt;Github&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/bunderLikeLion/sellon_frontend&quot;&gt;https://github.com/bunderLikeLion/sellon_frontend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/bunderLikeLion/sellon_backend&quot;&gt;https://github.com/bunderLikeLion/sellon_backend&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;peacepiece&quot;&gt;Peacepiece&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;일상생활 속 환경을 위한 활동을 기반으로 가상공간을 꾸밀 수 있는 웹플랫폼&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;기획자이면서, 디자이너이면서, 백엔드 개발자이면서, 프론트엔드 개발자였던 개인적으로 굉장히 힘들었던 프로젝트였습니다.&lt;/p&gt;
&lt;p&gt;Github&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(&lt;a href=&quot;https://github.com/today-they-learned/peacepiece_front)%5Bhttps://github.com/today-they-learned/peacepiece_front&quot;&gt;https://github.com/today-they-learned/peacepiece_front)[https://github.com/today-they-learned/peacepiece_front&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/today-they-learned/peacepiece_api&quot;&gt;https://github.com/today-they-learned/peacepiece_api&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;army-tiger&quot;&gt;Army Tiger&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;🪖 군대 일정을 Github 프로필에 남겨둘 수 있어요&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;군대를 가면서, 여러 지인이 군대 일정에 대해서 물어보았습니다. 그러면서.. 한번 마지막 사이드 프로젝트로는 요걸 만들어봐야겠다는 생각이 들어서 바로 만들었습니다.&lt;/p&gt;
&lt;p&gt;만드는 김에 다른 사람들도 쉽게 사용하면 좋지 않을까 싶어서 사용법 등도 최대한 자세하게 작성했습니다.&lt;/p&gt;
&lt;p&gt;Github&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/shinkeonkim/army-tiger&quot;&gt;https://github.com/shinkeonkim/army-tiger&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;혼세혼세한-개발-공부&quot;&gt;혼세혼세한 개발 공부&lt;/h3&gt;
&lt;p&gt;올해 계속 공부해온 것, 조금씩 찍먹을 해본 것, 공부해보려고 한 것들을 나열해보려고 합니다.&lt;/p&gt;
&lt;p&gt;군대를 다녀와서 어떤 걸, 어디서부터 시작할지 결정할때, 참고할 수 있지 않을까 싶습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[인프라]&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;docker&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;기존에 서버에서 바로 웹 서버를 띄웠던 것들을 모두 Dockerize하여 구성하였습니다.&lt;/li&gt;
&lt;li&gt;간단한 웹 서버를 구성해야할 때, 필요한 요소들을 템플릿화 하는 작업을 진행했습니다.&lt;/li&gt;
&lt;li&gt;이후에는, 기본적인 auth API 및 문서화 등을 할 수 있는 템플릿까지 만들면 좋을 것 같습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;docker-compose&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DB, Redis 등을 설치하여 구동하지 않고, docker container를 통해 구동하고, 이를 웹서버 등과 같이 사용하기 위해 docke-compose를 이용하였습니다.&lt;/li&gt;
&lt;li&gt;캐싱같은 최적화를 좀더 찾아보면서 익힐 필요가 있을 것 같습니다.&lt;/li&gt;
&lt;li&gt;최근에 docker-compose를 이용하여 개발을 할 때, alpha, beta, production 환경을 나누는 과정에서 좀더 간단하게 구성할 수 있는 방법을 찾고자 했지만 실패했습니다. 결국 파일을 모두 나누어 구성했습니다. 예를 들어, docker-compose.alpha.yml 라는 식으로..&lt;/li&gt;
&lt;li&gt;로컬에서 docker-compose를 이용하여 개발한 후, 이미지를 ECR에 올려서 ECS로 배포하는 작업을 시도했습니다. 이후에는 Terraform을 이용해 미리 인프라를 구성하고, 이 인프라와 함께 이 방식을 이용해보면 좋을 것 같습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;k8s&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;회사 동료분이 쿠버네티스를 강력 추천하여, 공부를 해보고 있었습니다.&lt;/li&gt;
&lt;li&gt;먼저, Django 웹 서버를 k8s에 얹어서 사용해보려 했지만.. 공부 기간이 너무 짧았습니다.&lt;/li&gt;
&lt;li&gt;군대에 가서는 쿠버네티스를 공부하고 실제로 해볼 방법이 없을 것 같아, 잠시 보류하려 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.terraform.io/&quot;&gt;Terraform&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS 인프라를 구성할 때, 최대한 Terraform을 이용하여 구성하고자 했습니다.&lt;/li&gt;
&lt;li&gt;인프라를 이전에 어떻게 구성했는지, 어떤 구성요소가 필요한건지에 대한 파악을 하기 쉬웠습니다.&lt;/li&gt;
&lt;li&gt;다만, 어떤 오류가 발생하였을 때, Terraform이 바로바로 오류를 뱉지 않고 오랜 시간동안 기다리는 경우가 있어서 불편했습니다.&lt;/li&gt;
&lt;li&gt;좀더 편한 방법을 공부해보면 좋을 것 같습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;[웹 프레임워크]&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rails
&lt;ul&gt;
&lt;li&gt;회사에서 계속 Rails를 이용한 개발을 했습니다.&lt;/li&gt;
&lt;li&gt;최근에는 Service, Form 구조를 활용한 모듈 분리를 가장 많이 시도했습니다.&lt;/li&gt;
&lt;li&gt;군대를 다녀와서도.. Rails가 여전히 살아있다면(제발) 토이 프로젝트로 Rails 개발을 해볼까 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Django
&lt;ul&gt;
&lt;li&gt;사이드 프로젝트에서는 거의 Django를 활용했습니다.&lt;/li&gt;
&lt;li&gt;웹 개발을 할 때, 가장 손에 익은 게 Python / Django 조합이었습니다.&lt;/li&gt;
&lt;li&gt;하지만 대부분, drf를 계속해서 사용하는 반복적인 내용이었습니다.&lt;/li&gt;
&lt;li&gt;Django와 더불어 새로운 기술을 더 활용하는 프로젝트를 진행하면 좋을 것 같습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Koa.js
&lt;ul&gt;
&lt;li&gt;큰 이유 없이 제 영어 이름이 Koa이기에, 한번 이름값(?)해보고자 시작해봤습니다.&lt;/li&gt;
&lt;li&gt;기존 Rails와 Django와 달리, node.js 진영의 웹 프레임워크들이 ORM을 쉽게 사용하는 방법이나, DB 마이그레이션을 효율적으로 관리하는 방법을 못 찾아서 그만두었습니다. 개발자에게 편리한 것이 많은 프레임워크들을 사용하다보니, 실망감이 컸던 것 같습니다. 나중엔 더 편해져있겠죠?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Spring
&lt;ul&gt;
&lt;li&gt;이후에는 Spring도 사용하지 않을까하는 막연한 생각으로 공부를 해보려 했습니다.&lt;/li&gt;
&lt;li&gt;인프런에서, 인프런 아이돌님의 강의를 쭉 듣고 있습니다. 생각보다 강의가 너무 많아서, 군대에서도 계속 들어보는 장기전이 될 것 같습니다.&lt;/li&gt;
&lt;li&gt;처음에 강의를 들으면서 든 생각은, 이거 Django에서는 되게 쉽게 되는데.. 였지만, 일단 참고 들어보고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;[언어]&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ruby
&lt;ul&gt;
&lt;li&gt;Rails를 하면서, 자연스레 루비 숙련도가 늘었습니다. PS를 할때도 ruby를 이따금씩 쓰기도 했습니다.&lt;/li&gt;
&lt;li&gt;single line if statement, ?/! method 등의 ruby에서 편한 문법을 좋아하게 되었습니다.&lt;/li&gt;
&lt;li&gt;하지만, Rails가 없는 루비는 정말 불편했습니다. 이후에 어떻게 공부를 이어나가야 할지 감이 오지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;python
&lt;ul&gt;
&lt;li&gt;python은 웹 개발 뿐만이 아니라 여러 분야에 다 활용했습니다. &lt;a href=&quot;https://github.com/shinkeonkim/BOJ/blob/main/create_directory.py&quot;&gt;로컬에서의 파일 정리&lt;/a&gt;등에도 말이죠.&lt;/li&gt;
&lt;li&gt;하지만, pythonic 하게 코드를 짤 줄 아니? 라고 물어보면 No라고 답할 것 같습니다. Production Python 코드에 대한 경험이 적기도 하고, Python Senior 개발자들의 코드를 훔쳐?보는 경험을 할 기회가 별로 없었습니다. 좀더 심오하게 파고들 필요가 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;rust
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.udemy.com/course/rust-programming-korean/&quot;&gt;유데미 강의&lt;/a&gt;를 듣고 있었습니다. 군대를 가서도 해당 강의를 계속 듣지 않을까 싶습니다.&lt;/li&gt;
&lt;li&gt;C/C++ 개발자들이 Rust로 옮겨가고 있는 추세로 보였고, 왜 그런지를 알고싶었습니다.&lt;/li&gt;
&lt;li&gt;웹 어셈블리를 이용한 웹 개발을 진행해보고 싶었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;c/c++
&lt;ul&gt;
&lt;li&gt;알고리즘 문제 풀이에만 활용했습니다.&lt;/li&gt;
&lt;li&gt;c/c++로 production 코드를 개발하고 싶지는 않습니다. c/c++은 알고리즘 문제 풀이로만 활용하고 싶고, 이 생각은 변하지 않을 것 같습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;[PS / 알고리즘]&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;아직 PS(Problem Solving) / 알고리즘 공부를 놓지 못했습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;주로 &lt;a href=&quot;https://www.acmicpc.net/&quot;&gt;BOJ&lt;/a&gt;와 &lt;a href=&quot;https://solved.ac/&quot;&gt;Solved.ac&lt;/a&gt;를 이용해 문제를 풀었습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://codeforces.com/&quot;&gt;Codeforces&lt;/a&gt;나 &lt;a href=&quot;https://atcoder.jp/&quot;&gt;Atcoder&lt;/a&gt;는 자신감이 부족해서 문제 수 4,000 문제와 다이아 3 달성하기 전까지는 안할려 합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;기본 구현 문제&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;최근에 Production 코드에 집착을 하다보니, 기본 구현 문제를 빠르게 생각하고 짜지 못하는 것 같았습니다.&lt;/li&gt;
&lt;li&gt;그래서 최대한 Bronze, Silver 문제들을 가볍고 빠르게 짜는 연습을 했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;문자열&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;구현 문제들을 풀면서, 많은 기본 문제를 풀게 되었습니다.&lt;/li&gt;
&lt;li&gt;하지만, 기본적인 KMP, Trie 등을 활용하는 문제를 최근에 안 풀어서, 숙련도가 낮아졌습니다. 예전부터 문자열 문제에는 손이 안가는 것 같습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DFS / BFS&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;solved.ac 에서 &lt;code&gt;lang:ko tag:dfs - @$me&lt;/code&gt; 라는 식으로 검색하여, 한국어 DFS 문제 중 내가 안 푼 문제를 검색하여, 난이도 순으로 쭉 풀고 있었습니다.&lt;/li&gt;
&lt;li&gt;채용 코테 또는 알고리즘 대회 등에서도 DFS/BFS는 무조건 한번은 나온다는 생각이 있기 때문에, 최대한 빠르고 정확하게 짜는 연습을 해보고 있습니다.&lt;/li&gt;
&lt;li&gt;생각보다 DFS가 많은 알고리즘의 기초라는 사실을 종만북을 다시 읽다가 깨닫게 되어서, 깊게 파보고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;트리&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;트리와 쿼리 시리즈를 계속 풀어보려고 트리 알고리즘들을 공부해보고 있었습니다.&lt;/li&gt;
&lt;li&gt;하지만.. 트리랑은 제 머리가 맞지 않나 싶을 정도로 안 풀렸지만요.. 일단 LCA / Sparse Table 들을 활용하는 기본 트리 문제를 다 풀어서, 배수진을 칠까 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;기하&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;기하는 알면 쉽지만, 모르면 못푸는 문제가 너무 많습니다. 이차원 벡터 등의 구현체들을 하나씩 만들어두면서 활용하고 있습니다.&lt;/li&gt;
&lt;li&gt;최근에 볼롤껍질, 회전하는 캘리퍼스 문제를 다시 풀어봤습니다. 역시나 알고나면 너무 쉬운 문제였습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;정수론&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;대학에서도 수학 공부를 별로 안했는데, 알고리즘 문제 풀겠다고 수학 공부를 하고 있는 저를 보고 참 웃겼습니다.&lt;/li&gt;
&lt;li&gt;정수론 책들을 사서까지 보고 있었는데, 군대가서 아마 요 책들을 읽지 않을까.. 싶네요.. 하하..&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;탐색&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;몇달전에야 삼진탐색을 제대로 알게 되었습니다. 하지만 카테고리를 보지않고 “이 문제 삼진 탐색이다!”하는 연습은 더 필요할 것 같습니다. 아직 이진탐색을 알아채는 것도 좀 늦는 것 같습니다 ㅠ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DP&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DP 문제들을 보고, 와 이거 DP다! 를 알아채는 시간은 줄었지만, 빠르고 간결하게 짜는 걸 더 연습해야 합니다.&lt;/li&gt;
&lt;li&gt;그리고 한번 긁어서 되는 기본적인 DP 문제들보다, 이제 DP 최적화 기법들을 공부해봐야 할 것 같습니다. 아마 &lt;a href=&quot;https://koosaga.com/242&quot;&gt;koosaga 님의 글&lt;/a&gt;을 참고해서 더 공부해야할 것 같습니다. &lt;code&gt;세상에, 너무 공부할게 많네요.&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;자격증을-땄다&quot;&gt;자격증을 땄다?&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;COS Pro 1급 Python&lt;/code&gt;과 &lt;code&gt;정보처리산업기사&lt;/code&gt;를 땄습니다.&lt;/p&gt;
&lt;p&gt;두 자격증을 따는 데, 긴 기간을 쓰지는 않았습니다.&lt;/p&gt;
&lt;p&gt;Cos Pro는 시험 전날에 무슨 문제가 나왔었나 찾아보는 정도였고,&lt;/p&gt;
&lt;p&gt;정보처리산업기사는 필기 한달, 실기 2주정도 자격증 책을 보고 공부(라고 하고 암기)했습니다.&lt;/p&gt;
&lt;p&gt;기존에 알고리즘이나 CS를 계속 공부하고 있던지라 그렇게 어렵지는 않았습니다.&lt;/p&gt;
&lt;p&gt;AWS 자격증도 따고 가고 싶었는데, 점점 미루고 미루다가 못 따고 가네요..&lt;/p&gt;
&lt;h2 id=&quot;결론&quot;&gt;결론&lt;/h2&gt;
&lt;p&gt;올해는 일 / 사이드 프로젝트 / 알고리즘 공부 / 유튜브, 넷플릭스 / 잠 의 반복이었지 않나 싶습니다.&lt;/p&gt;
&lt;p&gt;곧, 군대에 입대합니다. 내년에는 회고록을 쓸 수 있을지 잘 모르겠습니다.&lt;/p&gt;
&lt;p&gt;군대에 있으면서 시간이 날 때마다 개발 공부를 하고는 싶습니다.. 하게 된다면 그 내용들을 정리하는 글을 써봐도 좋을 것 같습니다.&lt;/p&gt;
&lt;p&gt;아무튼 다치지 않고 군대 잘 다녀오겠습니다.&lt;/p&gt;
&lt;p&gt;충성.&lt;/p&gt;</content:encoded><category>회고록</category><category>주니어 개발자</category><author>koa (김신건)</author></item><item><title>[BOJ] 16942 문자열 접기</title><link>https://shinkeonkim.com/posts/problem-solving/boj/2022-05-05-boj-16942/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/problem-solving/boj/2022-05-05-boj-16942/</guid><description>주어지는 문자열을 접어서, 같은 문자열로만 이루어지는 문자열을 만들어내면 된다.</description><pubDate>Thu, 05 May 2022 03:16:14 GMT</pubDate><content:encoded>&lt;h2 id=&quot;문제-요약-및-풀이&quot;&gt;문제 요약 및 풀이&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/16942&quot;&gt;16942번: 문자열 접기&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;주어지는 문자열을 접어서, 같은 문자열로만 이루어지는 문자열을 만들어내면 된다.&lt;/p&gt;
&lt;p&gt;문제에서 주어지는 예시를 쭉 보다보면, 한가지 사항을 발견할 수 있다.&lt;/p&gt;
&lt;p&gt;만들어내는 문자열의 각 문자의 &lt;code&gt;원래 문자열에서의 위치&lt;/code&gt;는 서로 홀수만큼 차이가 난다. (사이에 있는 숫자 갯수를 말하는 것이 아닌, 위치의 차이다.)&lt;/p&gt;
&lt;p&gt;따라서, 최대한 같은 문자를, 위치가 홀수만큼 차이가 나는 문자들을 선택하면 된다.&lt;/p&gt;
&lt;p&gt;물론 하나하나 따져가면 시간초과가 뜰테니.. DP로 풀어나갔다.&lt;/p&gt;
&lt;h2 id=&quot;풀이-코드&quot;&gt;풀이 코드&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#include&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;#x3C;bits/stdc++.h&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#define&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#define&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; for1j&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n; j&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;using&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; namespace&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;string s;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt; // 입력받을 문자열&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; d[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;], ans;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt; // d: DP 배열, d[i] = i번째 문자를 사용했을 때, 만들 수 있는 최대 문자열 길이&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  ios&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sync_with_stdio&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);cin.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tie&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);cout.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tie&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, n) d[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt; // 어찌되었든, 문자열을 접지 않으면, 모든 문자가 1로 가능하다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, n) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    for1j&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, i) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; j) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s[j]) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;        // 홀수 간격이고, 문자가 같은 경우&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        d[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; max&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(d[i], d[j] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, n) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // DP 배열에서 최대값을 뽑아낸다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ans &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; max&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(d[i], ans);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ans;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded><category>BOJ</category><category>PS</category><category>DP</category><author>koa (김신건)</author></item><item><title>[BOJ] 19718 King&apos;s Inspection</title><link>https://shinkeonkim.com/posts/problem-solving/boj/2022-01-08-boj-19718/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/problem-solving/boj/2022-01-08-boj-19718/</guid><description>문제 상황을 요약하면 다음과 같다.</description><pubDate>Sat, 08 Jan 2022 09:33:10 GMT</pubDate><content:encoded>&lt;h2 id=&quot;문제-요약-및-풀이&quot;&gt;문제 요약 및 풀이&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/19718&quot;&gt;19718번: King’s Inspection&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;문제 상황을 요약하면 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;자연수 a,b,c 가 주어진다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;주어진 자연수 a, b, c중 2개를 골라 1씩 더할 수 있다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;이때, 모든 숫자를 같게 만들기 위한 최소 덧셈 횟수는 몇번인가?&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;풀이-코드&quot;&gt;풀이 코드&lt;/h2&gt;
&lt;p&gt;문제를 보자마자, 바로 드는 생각은&lt;/p&gt;
&lt;p&gt;&lt;code&gt;그때 그때 가장 작은 숫자 2개를 골라 1씩 더해주면서 카운팅하면 되지 않을까?&lt;/code&gt; 였다.&lt;/p&gt;
&lt;p&gt;그래서 바로 아래와 같은 풀이를 작성했다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;l &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;cnt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; not&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  l.sort()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  cnt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(cnt)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(브론즈 2티어 문제라서 그렇게 어려운 풀이를 유도하지는 않을 거라 생각했고, 범위도 신경쓰지 않는 풀이를 작성해버렸다.)&lt;/p&gt;
&lt;p&gt;역시 위 풀이는 시간초과가 발생했고, 시간초과를 보고 나서 a, b, c의 최대 범위가 5억이라는 것을 확인했다.&lt;/p&gt;
&lt;p&gt;그래서 이제 간단하게 또 생각을 틀었다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;가장 작은 2개가 서로 같지 않다면 그 두 개를 격차만큼 더해주고, 같다면 가장 큰 수와의 격차를 더해주면 되지 않을까?&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;그리고 아래와 같은 풀이를 작성했다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;l &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;cnt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; not&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  l.sort()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    diff &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    diff &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; diff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; diff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  cnt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; diff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(cnt)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;하지만… 여기서 끝나지 않았다..&lt;/p&gt;
&lt;p&gt;바로 아래와 같은 케이스에서 너무나 늦게 답이 수렴되었기 때문이다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;499999999&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;500000000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;다시 한번 생각을 틀었다.&lt;/p&gt;
&lt;p&gt;무조건 작은 2개를 뽑는 게 아니라,&lt;/p&gt;
&lt;p&gt;먼저 큰 두 숫자의 격차를 더해주고, 그 두 숫자가 같다면(격차가 0이라면) 작은 2개의 격차를 더하자.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;l &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;cnt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; not&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  l.sort()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  diff &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; diff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  l[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; diff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  cnt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; diff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(cnt)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;단순하게 어떤 숫자를 선택해야 격차를 빨리 좁혀서 더해나갈 수 있을지 생각을 했고, 요렇게 AC를 받았다.&lt;/p&gt;
&lt;p&gt;끝&lt;/p&gt;</content:encoded><category>BOJ</category><category>PS</category><category>Greedy</category><author>koa (김신건)</author></item><item><title>[TIL] Window size에 따라 속도가 달라지는 CSS Animation 바로잡기</title><link>https://shinkeonkim.com/posts/til/2021-12-19-til-responsive-animation/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/til/2021-12-19-til-responsive-animation/</guid><description>새벽에 어쩌다 떠오른 아이디어로 짧고 굵게 토이 프로젝트를 진행해보고 있다.</description><pubDate>Sun, 19 Dec 2021 09:38:16 GMT</pubDate><content:encoded>&lt;h2 id=&quot;문제-상황&quot;&gt;문제 상황&lt;/h2&gt;
&lt;p&gt;새벽에 어쩌다 떠오른 아이디어로 짧고 굵게 토이 프로젝트를 진행해보고 있다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/shinkeonkim/can-you-catch-circle&quot;&gt;Github repo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.singun11.wtf/can-you-catch-circle/&quot;&gt;Site page&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;바로 Can you catch “Circle” 이다. 뭐.. 줄이자면 CCC 일 것 같다. ㅋㅋㅋ&lt;/p&gt;
&lt;img src=&quot;https://shinkeonkim.com/img/posts/2021-12-19/canyoucatchcircle.jpg&quot; alt=&quot;canyoucatchcircle&quot; class=&quot;w-50&quot;&gt;
&lt;p&gt;굉장히 단순한 웹 페이지 프로젝트이다.&lt;/p&gt;
&lt;p&gt;단순히 화면에 있는 “Circle”을 잡으면 된다.&lt;/p&gt;
&lt;p&gt;아직은 좌우로 움직이는 기믹밖에 없지만, 점차 추가해보려고 한다.&lt;/p&gt;
&lt;p&gt;아무튼, 방금 언급한 “좌우로 움직히는 기믹”을 만들던 중, 아래와 같은 코드에서 한가지 생각지도 못했던 이슈가 발생했다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.move-left-to-right&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  animation&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: just-left-to-right &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; linear&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; infinite&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  -webkit-animation-name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: just-left-to-right;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  -webkit-animation-duration&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  -webkit-animation-timing-function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;linear&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  -webkit-animation-iteration-count&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;infinite&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;@keyframes&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; just-left-to-right&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  0%&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    transform&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;translateX&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;-45&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;vw&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  50%&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    transform&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;translateX&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;45&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;vw&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  100%&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    transform&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;translateX&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;-45&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;vw&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;@-webkit-keyframes&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; just-left-to-right&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  0%&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    -webkit-transform&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;translateX&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;-45&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;vw&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  50%&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    -webkit-transform&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;translateX&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;45&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;vw&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  100%&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    -webkit-transform&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;translateX&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;-45&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;vw&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;바로 모바일과 PC에서의 화면 크기 차이 때문에 Circle이 다른 속도로 움직인다는 것이다.&lt;/p&gt;
&lt;p&gt;왤까? 오랜만에 간단한 물리 식 $$ V(속력) = D(거리) / T(시간) $$ 을 떠올려보자.&lt;/p&gt;
&lt;p&gt;여기서 거리는 $$ 90vw * 2 $$ 일 것 이다.(왕복 거리) 그리고 시간은 20초이다.&lt;/p&gt;
&lt;p&gt;한가지 의문이 들 수 있다. &lt;code&gt;어? 수치가 정해져있는데, 속력이 고정되어있는 것 아닌가요?&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;아니다&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;vw 는 화면 크기에 따라 달라지는 &lt;code&gt;가변단위&lt;/code&gt; 이기 때문이다.&lt;/p&gt;
&lt;p&gt;따라서, 자연스럽게 화면 크기가 커지면 속력이 증가하고, 화면 크기가 작아지면 속력이 감소한다.&lt;/p&gt;
&lt;p&gt;그래서 모바일에서 보면 굉장히 굉장히 느려지는 이슈가 발생한 것이었다.&lt;/p&gt;
&lt;h2 id=&quot;그럼-어떻게-고쳤나&quot;&gt;그럼 어떻게 고쳤나?&lt;/h2&gt;
&lt;p&gt;여러 가지로 시도해봤지만 SCSS에서 가져온 window width를 시간 개념으로 다시 convert 하는 방법을 찾지 못했다.&lt;/p&gt;
&lt;p&gt;그래서 해당 프로젝트는 Vue.js 프로젝트였기 때문에, js 단에서 속도를 정의하고 이걸 template에 주입하는 방식으로 해결했다.&lt;/p&gt;
&lt;p&gt;솔직히 마음에 드는 방법은 아닌지라, 조금이라도 더 좋은 방벙을 발견하면 고칠 것 같다.&lt;/p&gt;
&lt;p&gt;아래 코드가 해당 문제를 해결한 수정 내용이다. (해당 글과 상관없는 내용과 위에 첨부한 style 부분은 생략했다.)&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;vue&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;template&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  &amp;#x3C;!-- mdx-component: Circle --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;template&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; lang&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ts&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  computed,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  defineComponent, inject, onMounted, ref,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;vue&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Circle &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;@/components/Circle.vue&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; defineComponent&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    name: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;JustMovingPage&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    setup&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; VELOCITY&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 150&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; windowWidth&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; ref&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; compuetedAnimationDuration&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; computed&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; windowWidth.value &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; VELOCITY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;      onMounted&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        windowWidth.value &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; window.innerWidth;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        window.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;onresize&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          windowWidth.value &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; window.innerWidth;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        windowWidth,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        compuetedAnimationDuration,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      } &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    components: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      Circle&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;참고한-글&quot;&gt;참고한 글&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/51565331/set-reactive-screen-width-with-vuejs&quot;&gt;Stackoverflow: Set reactive screen width with vuejs&lt;/a&gt;&lt;/p&gt;</content:encoded><category>TIL</category><category>CSS</category><category>CSS Animation</category><category>Vue.js</category><author>koa (김신건)</author></item><item><title>[TIL] Django Alphanumeric Random String 생성하기</title><link>https://shinkeonkim.com/posts/til/2021-12-14-til-django-get_random_string/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/til/2021-12-14-til-django-get_random_string/</guid><description>웹 서비스를 구성하다보면, 종종 랜덤 문자열을 뽑아내야 하는 경우가 있다.</description><pubDate>Tue, 14 Dec 2021 12:40:53 GMT</pubDate><content:encoded>&lt;h2 id=&quot;django에서-랜덤-문자열-쉽게-만들어내기&quot;&gt;Django에서 랜덤 문자열 쉽게 만들어내기&lt;/h2&gt;
&lt;p&gt;웹 서비스를 구성하다보면, 종종 랜덤 문자열을 뽑아내야 하는 경우가 있다.&lt;/p&gt;
&lt;p&gt;이번에는 사용자가 직접 가입하지 않고 초대를 받아 가입하는 서비스를 구성하던 중에, 임의적으로 유저의 username을 설정해야 했다.
이전에는 random module을 이용해 작성했지만, 이번에는 Django에서 지원하는 모듈로 작성하고자 찾아봤다.&lt;/p&gt;
&lt;h2 id=&quot;get_random_string&quot;&gt;get_random_string&lt;/h2&gt;
&lt;p&gt;바로, &lt;code&gt;get_random_string&lt;/code&gt;이다.&lt;/p&gt;
&lt;p&gt;아래와 같이 import 하면 된다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; django.utils.crypto &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; get_random_string&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;사용방법&quot;&gt;사용방법&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;length를 무조건 넘겨주어야 한다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;get_random_string(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;allowed_chars를 이용해서 랜덤으로 뽑아낼 문자의 후보를 한정할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;get_random_string(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;allowed_chars&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ABCD&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;번외로 말하면 allowed_chars는 아래와 같이 하드코딩되어서 들어가고 있는 구조이다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;RANDOM_STRING_CHARS&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; get_random_string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(length&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;NOT_PROVIDED&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, allowed_chars&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;RANDOM_STRING_CHARS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;따라서, 아래와 같이 allowed_chars를 한글로 대체하여 한글 랜덤 문자열을 자연스럽게 뽑아낼 수도 있다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;get_random_string(3, &quot;가나다&quot;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;</content:encoded><category>TIL</category><category>python</category><category>Django</category><category>random</category><author>koa (김신건)</author></item><item><title>대학교 2학년 휴학생, 회사에서 2021년 회고록</title><link>https://shinkeonkim.com/posts/my-life/2021-12-09-goodbye-2021/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/my-life/2021-12-09-goodbye-2021/</guid><description>한달, 아니 적어도 분기마다 회고록을 쓰려고 했지만.. 항상 키보드를 잡다가, 포기해왔다. 하지만 올해는 마무리 지어야하기에 끄적여본다.</description><pubDate>Thu, 09 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;style&gt;
  img.align-left {
    position: relative;
    left: 0%;
    tranform: none;
  }
&lt;/style&gt;
&lt;blockquote&gt;
&lt;p&gt;한달, 아니 적어도 분기마다 회고록을 쓰려고 했지만.. 항상 키보드를 잡다가, 포기해왔다. 하지만 올해는 마무리 지어야하기에 끄적여본다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;img src=&quot;https://shinkeonkim.com/img/posts/2021-12-09/intro.jpg&quot; width=&quot;400&quot;&gt;
&lt;h3 id=&quot;-왜-휴학하고-회사를-다니게-되었을까&quot;&gt;🚀 왜 휴학하고 회사를 다니게 되었을까?&lt;/h3&gt;
&lt;p&gt;전 19학번으로 대학교에 입학했습니다.&lt;/p&gt;
&lt;p&gt;그리고 우연히, 정말 우연한 기회로 그렙이라는 회사에서 1학년 여름방학 인턴을 하게 되었었습니다. 알고리즘 컨텐츠 제작자로 근무를 했고, 그렇게 1학년 겨울방학, 2학년 여름방학까지 알고리즘 컨텐츠 제작자로 근무했습니다.&lt;/p&gt;
&lt;p&gt;그러던 중,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;알고리즘 컨텐츠 제작자로 근무를 하는 건, 나에게 의미가 있을까?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;지금 하고 있는 이 경험은 나에게 새로운 자극을 주는 경험일까?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;라는 의문이 들었습니다.&lt;/p&gt;
&lt;p&gt;그리고 2학년 겨울 방학에는 꼭 &lt;code&gt;&quot;개발자&quot;&lt;/code&gt;  인턴을 경험해보자 생각을 했고, 바로 도전해봤습니다. 여러 곳에 서류를 넣었고 면접을 봤었지만, 결국 한번 더 가장 좋은 조건과 기회를 제공해주신 그렙에서 2020년 12월 부터 개발자로 근무를 하게 되었습니다.&lt;/p&gt;
&lt;p&gt;근무를 시작하기 전, 2학기 기말고사를 마무리 짓고 부리나케 그렙에서 사용하는 Ruby on rails 기술스택을 익히기 시작했습니다.&lt;/p&gt;
&lt;p&gt;Ruby on rails을 익히기 위해서, 책도 찾아보고, 여러 글도 찾아보았지만, 결국 가장 좋은 것은 공식 문서였습니다. 책과 공식문서를 읽어가면서 일주일동안 Ruby on rails 스택을 익혔습니다. 어쩌면 이전부터 계속 사용하던 주 스택이 Django였던 지라 익숙함을 느끼며 금방 습득했던 것 같습니다.&lt;/p&gt;
&lt;p&gt;인턴으로 입사한 후, Ruby on rails를 활용하는 간단한 업무를 주셨고 빠르게 내부 레거시를 습득하면서도 Ruby on rails를 공부할 수 있는 기회를 얻을 수 있었습니다. (이후엔 여러 주니어 개발자분들이 비슷한 시기에 입사하셔서 같이 레일즈스터디를 이어갔고, 이게 큰 도움이 되었습니다.)&lt;/p&gt;
&lt;p&gt;그렇게 계속 열심히 일을 하던 중에 1월 쯤, 경영진의 정규직 제안을 받게 되었습니다. 여기서 굉장히 고민을 많이 하게 되었습니다. 1년에서 2년 가량의 경력을 대학교 중간에 쌓을 수 있는 기회가 생각보다 크게 다가왔고, 그렇기엔 아직 졸업을 못한 저 자신이 너무 부담스럽기도 했습니다.&lt;/p&gt;
&lt;p&gt;그래도.. 지금 당장 제가 재밌고, 할 수 있는 것을 하자는 생각으로 학교를 휴학하고(때려치우고 ?!) 2021년을 그렙에서 보내게 되었습니다. 🥰&lt;/p&gt;
&lt;h3 id=&quot;-1년동안-어떻게-성장했나&quot;&gt;🌱 1년동안 어떻게 성장했나?&lt;/h3&gt;
&lt;h5 id=&quot;--아직-손에-쥐고-있었다-동아리-활동&quot;&gt;🦁  아직 손에 쥐고 있었다. 동아리 활동&lt;/h5&gt;
&lt;p&gt;학교를 갑작스럽게 휴학하게 되면서, 원래 하고 있던 동아리 활동에 영향을 주게 되었습니다. 2021년에는 국민대학교 멋쟁이사자처럼 운영진 대표로서 역할을 다하기로 하였었지만, 학교를 다니지 않게 되면서 적지 않은 영향을 주게 되지만, 코로나의 영향으로 비대면 활동을 이어가게 되면서 회사와 동아리 활동을 이어갔습니다.&lt;/p&gt;
&lt;p&gt;먼저, 국민대학교 멋쟁이사자처럼에서 주마다 HTML, CSS, Django 관련 세션을 이어갔고, 이를 준비하는 과정에서 다시 한번 Django에 대한 지식을 점검할 수 있었습니다.
그리고 다른 사람들에게 제 지식을 전파하는 경험을 하게 되었습니다.&lt;/p&gt;
&lt;h5 id=&quot;--재미있는-프로젝트를-많이-해보자&quot;&gt;🥊  재미있는 프로젝트를 많이 해보자.&lt;/h5&gt;
&lt;p&gt;전 친구들이 취미가 뭐라고 물어보면, &lt;code&gt;뭔지 알잖아? 개발&lt;/code&gt; 이라고 답해왔는데, 이번년도에도 시간이 날때마다 토이 프로젝트를 하려고 해왔습니다. 일단 정리 겸, 한번 나열해보겠습니다. 🧐
나열을 해보니, 생각보다 올해 일단 많은 프로젝트/아이디어를 내놓으려고 했던 것 같습니다.. 내년엔 조금 더 완성도 있는 프로젝트들을 내놓아보는 걸 목표로 해보고 싶습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Django Coffee Model&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;github: &lt;a href=&quot;https://github.com/shinkeonkim/django-coffee-model&quot;&gt;django-coffee-model 오픈소스 프로젝트&lt;/a&gt;&lt;/p&gt;
&lt;img class=&quot;align-left&quot; src=&quot;https://shinkeonkim.com/img/posts/2021-12-09/pypi.png&quot; width=&quot;400&quot; alt=&quot;pypi&quot;&gt;
&lt;p&gt;timestamps를 조금더 쉽게 사용할 수 있게 만들어주는 단순한 django 라이브러리 입니다.
pypi에 배포하였고, 이후 제가 만드는 프로젝트들에서도 사용하면서 유지보수를 했습니다. (물론 첫번째 오픈소스라서 나중에 다 갈아엎고 싶을 정도로 버전 관리를 엉망으로 한 것 같습니다.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;팩토리 유튜버의 영상 삭제를 막아보자!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;github: &lt;a href=&quot;https://github.com/shinkeonkim/prevent-factory-video-deletion&quot;&gt;prevent-factory-video-deletion 프로젝트&lt;/a&gt;&lt;/p&gt;
&lt;img class=&quot;align-left&quot; src=&quot;https://img.youtube.com/vi/oiQUD5WBChk/0.jpg&quot; width=&quot;400&quot; alt=&quot;factory&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=oiQUD5WBChk&quot;&gt;유튜버 팩토리 님의 영상&lt;/a&gt;을 보고 시작하게 된 프로젝트입니다.&lt;/p&gt;
&lt;p&gt;영상의 주요 내용은, 해당 영상에 60분마다 댓글이 달리지 않으면 영상을 삭제하겠다는 내용입니다. 이걸 보고 전, &lt;code&gt;어? 깃헙 액션에 cron job 기능도 생겼는데, 이걸 한번 써서 크롤링해볼까?&lt;/code&gt; 라는 생각을 했고, 바로 코드로 옮겨봤습니다. 하지만.. 로컬에서 작동하던 코드가 깃헙 액션으로 옮겨지니 크롤링이 잘 되지 않는 모습을 보였습니다. ㅠㅠ. 유튜브 사이트 내부에서 크롤링을 막기 위해 무언가를 해둔 것 같았지만.. 해결하지 못하고 이 프로젝트는 멈추게 되었습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Github action을 이용해 슬랙에 주기적으로 메세지를 보내보자!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;github: &lt;a href=&quot;https://github.com/shinkeonkim/kmu-likelion-slack-noti-action&quot;&gt;kmu-likelion-slack-noti-action 프로젝트&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;이전 글에서 다루었던, 프로젝트입니다.
아래 글을 참고해주세요.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://shinkeonkim.com/posts/TIL-slack-web-hook-and-github-action/&quot;&gt;글 보러 가기&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;무야~호&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;github: &lt;a href=&quot;https://github.com/shinkeonkim/mooyaho&quot;&gt;mooyaho 프로젝트&lt;/a&gt;&lt;/p&gt;
&lt;img class=&quot;align-left&quot; src=&quot;https://shinkeonkim.com/img/posts/2021-12-09/mooyaho.png&quot; width=&quot;400&quot; alt=&quot;mooyaho&quot;&gt;
&lt;p&gt;2021년 초, 한동안 무야호 밈이 유행했었습니다. 한번 짤생성기를 경험삼아 Vue.js로 간단하게 만들어볼까 하고 시도한 프로젝트입니다.
그냥 살짝 맛만 보고.. 더이상 개발하지 않아서, 조금 아쉬운 프로젝트인 것 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mooyaho.me/&quot;&gt;아직도 돌아가고 있는 허접한 사이트 보러가기 - https://mooyaho.me/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;대학생 멋쟁이사자처럼 프로필을 이쁘게 보여주는 프로젝트&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;github: &lt;a href=&quot;https://github.com/shinkeonkim/likelion-badge&quot;&gt;likelion-badge 프로젝트&lt;/a&gt;&lt;/p&gt;
&lt;img class=&quot;align-left&quot; src=&quot;https://shinkeonkim.com/img/posts/2021-12-09/likelion.svg&quot; width=&quot;400&quot; alt=&quot;likelion&quot;&gt;
&lt;p&gt;해당 프로젝트는 Github README에서도 언급되어있듯이 &lt;a href=&quot;https://github.com/mazassumnida/mazassumnida&quot;&gt;mazassumnida 프로젝트&lt;/a&gt;를 보고 영감을 받아 진행해본 프로젝트입니다.&lt;/p&gt;
&lt;p&gt;단순히, 멋쟁이사자처럼 기수와, 대학교 영어명을 param으로 넘기면 원하는 뱃지를 svg로 얻어내는 사이트를 만들고 배포했습니다.&lt;/p&gt;
&lt;p&gt;해당 배지를 주로 Github Profile README나 노션 이력서 등에 첨부하는 것을 의도한 프로젝트입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;해커톤을 운영하면서, 정해진 기간에 개발된 프로젝트가 맞는지 알아야 했다!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;github: &lt;a href=&quot;https://github.com/shinkeonkim/github-repository-start-date-checker&quot;&gt;github-repository-start-date-checker&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;하반기 중에, 멋쟁이사자처럼 대학교들이 모여 연합해커톤을 여는데, 어흥올림픽 이라는 해커톤 운영진으로 참가하게 되었습니다.&lt;/p&gt;
&lt;p&gt;해커톤 운영 규칙중, XX월 OO일 이전부터 시작된 프로젝트는 인정하지 않습니다. 라는 식의 규칙이 있었고, 이를 검증할 방법이 필요했습니다.&lt;/p&gt;
&lt;p&gt;다른 운영진분께서 크롤링을 이용한 코드를 작성해주셨고, &lt;code&gt;Github API를 이용하는게 더 편하지않을까?&lt;/code&gt; 라는 생각이 들어서 이를 리팩토링하여 프로젝트를 간단하게 구성하고 실제로 활용했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;바빠도 해커톤은 참가해야지&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;github: &lt;a href=&quot;https://github.com/likelion-kookmin/daedong-food-map&quot;&gt;대동먹지도 프로젝트&lt;/a&gt;&lt;/p&gt;
&lt;img class=&quot;align-left&quot; src=&quot;https://user-images.githubusercontent.com/47373998/130307221-29ebcab4-dc5a-4c91-a208-6ac2619a44a5.png&quot; width=&quot;400&quot; alt=&quot;hackathon&quot;&gt;
&lt;p&gt;멋쟁이사자처럼 중앙 해커톤을 멋쟁이사자처럼 구성원분들과 같이 참가하게 되었고, 대동먹지도라는 프로젝트를 진행했습니다.
정말 사소한 먹거리들을 서로 공유하는 플랫폼을 만들어보자는 아이디어였고, 아쉽게도 수상하지는 못했습니다.&lt;/p&gt;
&lt;p&gt;백엔드는 Django,(Django rest framework) 프론트엔드는 React,js로 구성했던 프로젝트입니다.&lt;/p&gt;
&lt;p&gt;저는 백엔드, 프론트엔드 전반적인 구조를 구성하고, 각 환경을 배포하는 역할을 맡았습니다.&lt;/p&gt;
&lt;p&gt;이 플젝을 하면서…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Django Rest Framework를 전보다 훨씬 빡세게 써볼 수 있었습니다.(문서화, Class based View 등등..)&lt;/li&gt;
&lt;li&gt;React.js에서는 Redux를 통한 상태관리를 어떻게 더 잘할 수 있는지 알 수 있게 되었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&quot;️-코드-리뷰는-정말로-소중했다&quot;&gt;⌨️ 코드 리뷰는 정말로 소중했다.&lt;/h5&gt;
&lt;p&gt;1년동안 그렙을 다니면서, 절 가장 성장시킨 존재는 코드 리뷰인 것 같습니다.&lt;/p&gt;
&lt;p&gt;이전에는 코드 리뷰는 어떻게 하는거지? 왜 하는거지? 등등 머리속에 의문만이 가득한 존재였지만, 지금은 꼭 있어야 하는 존재로 저에게 남았습니다.&lt;/p&gt;
&lt;p&gt;먼저, 코드 리뷰를 하면서 받았던 피드백들을 따로 모아두고, 기억하면서 비슷한 상황이 나왔을 때, ‘아, 이전엔 이렇게 했었지?’ 하는 도움말이 생겼습니다.&lt;/p&gt;
&lt;p&gt;그리고 어떻게 효율적으로 짤 수 있을지, 어떻게 다른 사람이 봐도 이해가 되는 코드 구조를 구성할 수 있을지에 대한 고민을 하는 능력을 기를 수 있었습니다.&lt;/p&gt;
&lt;p&gt;또한, 저의 코드 뿐만 아니라, 다른 사람이 구성한 코드를 볼 때도 새로운 지식들을 배울 수 있었고, 실제로 배운 것들을 써먹기도 하면서 좋은 코드들을 습득하는 기회를 가질 수 있었습니다.&lt;/p&gt;
&lt;p&gt;(다음 회사, 다다음 회사를 가더라도, 전 꼭 코드 리뷰가 있고 자유로운 개발문화를 가진 회사를 가야겠다는 다짐도 하게 되었습니다.)&lt;/p&gt;
&lt;h5 id=&quot;--1일--1-oo&quot;&gt;🗓  1일  1 OO&lt;/h5&gt;
&lt;p&gt;올해까지 해서, 현재 대력 2년간 1일 1커밋을 이어왔습니다. (아직 올해가 다 가지 않았지만..)&lt;/p&gt;
&lt;img class=&quot;align-left&quot; src=&quot;https://shinkeonkim.com/img/posts/2021-12-09/2020.png&quot; width=&quot;500&quot; alt=&quot;2020&quot;&gt;
&lt;img class=&quot;align-left&quot; src=&quot;https://shinkeonkim.com/img/posts/2021-12-09/2021.png&quot; width=&quot;500&quot; alt=&quot;2021&quot;&gt;
&lt;p&gt;대략 2019년 12월 부터 시작한 1일 1커밋을 지금까지 이어온 것이 되게 뿌듯하네요.&lt;/p&gt;
&lt;p&gt;주변에서, 이따금 계속 1일 1커밋 하기 힘들지 않냐라는 질문을 주시긴 합니다.&lt;/p&gt;
&lt;p&gt;저도 처음 1일 1커밋을 시작했을 때는 너무나 힘들었던 것 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&quot;할 커밋이 없었으니까요.&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;아는 것도 얼마 없고, 프로젝트는 당연히 진행하고 있지 않았습니다.&lt;/p&gt;
&lt;p&gt;그래서 무작정 알고리즈 문제를 풀고 이것부터 커밋하는 습관을 들이기 시작했습니다. 점차 커밋에 대한 부담감이 줄어들었고 여러 지식을 얻어가면서 프로젝트도 시작해갔습니다.&lt;/p&gt;
&lt;p&gt;그렇다보니 요즘 평소 제 생활을 하다보면 어느새 하루에 1일 1커밋이 되어있는 것 같습니다. 평일 낮에는 일을 하고, 밤에는 프로젝트를 하고, 주말에는 프로젝트/공부를 하니까요.&lt;/p&gt;
&lt;p&gt;그리고 1일 1커밋을 이은 &lt;code&gt;1일 1문제&lt;/code&gt;를 시도하고자 하고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;solved.ac&lt;/code&gt;에서는 백준 문제를 풀고 이를 스트릭으로 나타내주고 있습니다. 이를 이용해서 잔디를 또 채워보고 있습니다.&lt;/p&gt;
&lt;img class=&quot;align-left&quot; src=&quot;https://shinkeonkim.com/img/posts/2021-12-09/solved.png&quot; width=&quot;500&quot; alt=&quot;solved&quot;&gt;
&lt;p&gt;이전에 1일 1커밋을 했을 때처럼, 지금은 쉬운 문제들로만 시도해보고 있습니다. 처음부터 어려운 문제들로 채워나가기엔 저에게 너무나 큰 스트레스를 줄 것 같았습니다.&lt;/p&gt;
&lt;p&gt;지금은 습관만 가지자는 마음으로 브론즈 문제들로 채워가고 있고, 점차 풀 문제가 사라지면 난이도를 하나씩 올려가면 문제들을 계속 풀어나가보려 합니다.&lt;/p&gt;
&lt;h3 id=&quot;내년엔-무슨-성장을-할까&quot;&gt;내년엔 무슨 성장을 할까?&lt;/h3&gt;
&lt;h5 id=&quot;djangorailsaws를-좀-더-깊게-파보자&quot;&gt;Django/Rails/AWS를 좀 더 깊게 파보자.&lt;/h5&gt;
&lt;p&gt;내년엔 조금 더 깊게 Django/Rails/AWS를 파보려고 합니다.&lt;/p&gt;
&lt;p&gt;Django/Rails에 대해서는 아직까지 계획이 크게 없지만 더 Production에 맞는 코드를 구성하는 방법에 대해서 파볼까 계획 중입니다.&lt;/p&gt;
&lt;p&gt;AWS는 관련 자격증을 따면서 공부하려고 합니다. 하지만..&lt;/p&gt;
&lt;h5 id=&quot;안타깝다&quot;&gt;안타깝다.&lt;/h5&gt;
&lt;p&gt;안타깝게도 내년엔 성장을 할 수 있는 기간이 짧을 것 같습니다.&lt;/p&gt;
&lt;p&gt;저는 현역 판정을 받은 21세 (2021 기준)이고, 군대를 더이상 미룰 수 없다는 판단을 했고, 하반기 혹은 내후년 상반기 중에는 군대를 가야할 것 같습니다.&lt;/p&gt;
&lt;h5 id=&quot;자격증을-따자&quot;&gt;자격증을 따자.&lt;/h5&gt;
&lt;p&gt;앞서 말한 군대를 위해, 여러 자격증을 딸 생각이다. 단순히 군대를 위한 자격증만은 아니고, 이후 내 커리어를 위해서도 필요하겠다 싶은 자격증들을 하나씩 모아두려고 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cos Pro&lt;/li&gt;
&lt;li&gt;정보처리산업기사&lt;/li&gt;
&lt;li&gt;AWS Certified Developer - Associate&lt;/li&gt;
&lt;li&gt;SQLD&lt;/li&gt;
&lt;li&gt;기타..?&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&quot;조금-더-기록을-할-수-있는-방법이-없을까&quot;&gt;조금 더 기록을 할 수 있는 방법이 없을까?&lt;/h5&gt;
&lt;p&gt;군대를 가더라도.. 아마 휴대폰은 쓸 수 있을 것 같고.. 미래의 저를 위해서 휴대폰에서도 쉽게 제가 현재 가지고 있는 지식을 계속 볼 수 있게 만들어보고 싶습니다.&lt;/p&gt;
&lt;p&gt;아마 블로그에 글을 계속 쓰는 것으로 할 것 같지만.. 조금 더 부담감없는 방법이 없을까? 생각을 더 많이 해봐야 할 것 같습니다.&lt;/p&gt;
&lt;h3 id=&quot;결론&quot;&gt;결론&lt;/h3&gt;
&lt;img class=&quot;align-left&quot; src=&quot;https://shinkeonkim.com/img/posts/2021-12-09/coajigyeong.png&quot; width=&quot;400&quot; alt=&quot;coajigyeong&quot;&gt;
&lt;p&gt;올해 주니어 개발자로서 성장을 계속 해보자는 마음으로 살아온 것 같습니다.&lt;/p&gt;
&lt;p&gt;내년에는 더 깊은 분야로 빠져드는 공부를 해보고 싶지만, 이제 새로운 도전을 해야 하는 시점에 왔기에 어떤 변곡점이 생길지 모르겠습니다.&lt;/p&gt;
&lt;p&gt;지금처럼 행복하고 만족스러운 개발을 이어가는 개발자가 되고 싶습니다.&lt;/p&gt;
&lt;p&gt;끝.&lt;/p&gt;</content:encoded><category>회고록</category><category>주니어 개발자</category><author>koa (김신건)</author></item><item><title>[TIL] 슬랙 웹훅과 깃헙 액션을 이용해 알림 봇 만들기</title><link>https://shinkeonkim.com/posts/til/2021-11-18-til-slack-web-hook-and-github-action/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/til/2021-11-18-til-slack-web-hook-and-github-action/</guid><description>국민대학교 멋쟁이사자처럼에서 슬랙을 사용하기로 했고, 내부 스터디인 줌터디도 슬랙에서 활동을 하게되었다. 이때, 특정 시간마다 회고글을 쓰라는 메세지가 주기적으로 오는 봇이 있으면 좋겠다고 생각이 들었다.</description><pubDate>Thu, 18 Nov 2021 11:02:09 GMT</pubDate><content:encoded>&lt;h2 id=&quot;계기&quot;&gt;계기&lt;/h2&gt;
&lt;p&gt;국민대학교 멋쟁이사자처럼에서 슬랙을 사용하기로 했고, 내부 스터디인 줌터디도 슬랙에서 활동을 하게되었다.
이때, 특정 시간마다 회고글을 쓰라는 메세지가 주기적으로 오는 봇이 있으면 좋겠다고 생각이 들었다.&lt;/p&gt;
&lt;p&gt;그래서 바로 워크플로빌더를 켰지만… 무료 플랜에서는 사용할 수 없었다…&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://shinkeonkim.com/img/posts/2021-11-18/TIL-slack-web-hook-and-github-action/wtf.png&quot; alt=&quot;wtf&quot;&gt;&lt;/p&gt;
&lt;p&gt;그래서 직접 만들자! 결심했다.&lt;/p&gt;
&lt;p&gt;일단 먼저 슬랙에 메세지를 보내기 위해, Slack Incoming Webhook을 설정했다.&lt;/p&gt;
&lt;p&gt;큰 이슈는 없고, 딱 Webhook URL만 알아내면 된다. (간단해서.. 스킵..)&lt;/p&gt;
&lt;p&gt;그리고 이제 주기적으로 메세지를 보내는 환경을 만들어야 한다.&lt;/p&gt;
&lt;p&gt;cron job을 실행할 서버가 따로 있을까 고심하던 중, Github Action을 떠올렸고 구글링을 해서 간단한 파이썬 프로젝트를 구성했다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.github/workflow/python-apps.yml&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Noti Zoom Study&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  schedule&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;cron&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;0 11 ? * SUN&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  workflow_dispatch&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;jobs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  build&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    runs-on&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ubuntu-latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    steps&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;uses&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;actions/checkout@v2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Set up Python 3.10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      uses&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;actions/setup-python@v2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      with&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        python-version&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;3.10&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Install dependencies&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      run&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        python -m pip install --upgrade pip&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        if [ -f requirements.txt ]; then pip install -r requirements.txt; fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Noti&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      run&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;python actions/zoom_study_notice.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      env&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        ZOOM_STUDY_WEBHOOK_URL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;${{ secrets.ZOOM_STUDY_WEBHOOK_URL }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;actions/zoom_study_notice.py&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; os, sys&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;__file__&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;))))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; dotenv &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; load_dotenv&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; api.slack &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; post_text&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;load_dotenv(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;verbose&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;ZOOM_STUDY_WEBHOOK_URL&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; os.environ.get(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ZOOM_STUDY_WEBHOOK_URL&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;ZOOM_STUDY_NOTICE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&quot;&quot;&amp;#x3C;!channel&gt; 이번주가 지났습니다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1. 한 주동안 달성하고자 하는 목표를 적어주세요.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;2. 지난 일주일동안의 목표 달성률과 그 이유를 적어주세요&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;[예시]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;😀 이번주 목표&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  - 도메인 주도 설계 책 4챕터까지 읽기&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;🤗 지난주 달성&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  - 75/100, 3챕터까지 다 읽고자했지만, 못 읽었다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;😉 목표의 방향은 정해져있지않아요.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;🙃 스스로 할 수 있는 목표치를 정해보아요.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;😇 매주 목표를 정하고, 점검해보아요&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;🥰 목표가 많다면 여러개를 적어도 돼요&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; __name__&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;__main__&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ret &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; post_text(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;ZOOM_STUDY_WEBHOOK_URL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;ZOOM_STUDY_NOTICE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(ret)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://deepbaksu.github.io/2020/09/18/slack-github-action-automation/&quot;&gt;참고한 블로그&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/shinkeonkim/kmu-likelion-slack-noti-action&quot;&gt;Github Repository&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;이번에 cron을 쉽게 만들려고 알아보던 중에, &lt;a href=&quot;http://www.cronmaker.com/&quot;&gt;cronmaker&lt;/a&gt;라는 사이트를 처음 알게 되었다. cron 정규 표현식을 더 쉽게 만들어준다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;메세지가 잘 온다!
&lt;img src=&quot;https://shinkeonkim.com/img/posts/2021-11-18/TIL-slack-web-hook-and-github-action/result.png&quot; alt=&quot;result&quot;&gt;&lt;/p&gt;</content:encoded><category>TIL</category><category>슬랙 webhook</category><category>Github action</category><author>koa (김신건)</author></item><item><title>[BOJ] 15087 DRM Messages</title><link>https://shinkeonkim.com/posts/problem-solving/boj/2021-11-08-boj-15087/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/problem-solving/boj/2021-11-08-boj-15087/</guid><description>- python에서 ord, chr을 잘 활용하자. - 단계별로 최대한 함수를 나누어 구현해보면, 더 쉽게 문제가 해결된다.</description><pubDate>Mon, 08 Nov 2021 06:42:51 GMT</pubDate><content:encoded>&lt;h2 id=&quot;문제-요약-및-풀이&quot;&gt;문제 요약 및 풀이&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/15087&quot;&gt;15087번: DRM Messages&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;python에서 ord, chr을 잘 활용하자.&lt;/li&gt;
&lt;li&gt;단계별로 최대한 함수를 나누어 구현해보면, 더 쉽게 문제가 해결된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;풀이-코드&quot;&gt;풀이 코드&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; get_sum&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; sum&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;ord&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(i) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 65&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; rotate_chr&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s, n):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; chr&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;ord&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 65&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 26&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 65&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; divide&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s[: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;], s[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; rotate&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s, n):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.join([rotate_chr(i, n) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; merge&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a, b):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.join([rotate_chr(a[i], &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;ord&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(b[i]) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 65&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a))])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; input&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;s1, s2 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; divide(s)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(merge(rotate(s1, get_sum(s1)), rotate(s2, get_sum(s2))))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded><category>BOJ</category><category>PS</category><category>구현</category><author>koa (김신건)</author></item><item><title>[BOJ] 9881 Ski Course Design</title><link>https://shinkeonkim.com/posts/problem-solving/boj/2021-10-23-boj-9881/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/problem-solving/boj/2021-10-23-boj-9881/</guid><description>문제를 간단?하게 요약/번역해보자.</description><pubDate>Sat, 23 Oct 2021 08:05:14 GMT</pubDate><content:encoded>&lt;h2 id=&quot;문제-요약-및-풀이&quot;&gt;문제 요약 및 풀이&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/9881&quot;&gt;9881번: Ski Course Design&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;문제를 간단?하게 요약/번역해보자.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;땅의 높이를 나타내는 숫자 n개가 주어진다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;각 땅의 높이를 낮추거나 높일 수 있을 때, &quot;가장 높은 땅의 높이&quot;와 &quot;가장 낮은 땅의 높이&quot;의 격차를 17보다 작거나 같게 만들어야 한다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;이때, 총 비용을 구해야 한다. 단, 각 땅의 높이를 k만큼 낮출 때 비용은 k*k이다.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;얼핏보면 심플해보이지만, 아래 테케와 같은 경우&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;20&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;21&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;24&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;작업 후, 전체 높이가 &lt;code&gt;[4, 4, 20, 21, 21]&lt;/code&gt; 와 같이 될 때 최소다. 특정 최소 지점과 최대 지점만 잡고 계산하면 안 된다는 의미이다.&lt;/p&gt;
&lt;p&gt;(제 풀이는 다른 분들의 풀이와 다른 것 같다; 문제 풀이 보기를 하니 제가 너무 꼬아서 풀었던 것 같다 ㅠ)&lt;/p&gt;
&lt;p&gt;그래서 일단 정렬을 기본으로 하고,&lt;/p&gt;
&lt;p&gt;두 왼쪽, 오른쪽 구간을 설정하고, 각각의 구간에 포함되어있는 숫자는 모두 같다고 가정했다.&lt;/p&gt;
&lt;p&gt;왼쪽 구간은 무조건 증가시키는 구간, 오른쪽 구간은 무조건 감소시키는 구간으로 생각하였고, 아직 왼쪽 구간과 오른쪽 구간의 격차가 17 이상이라면 증가/감소 액션을 수행했다.&lt;/p&gt;
&lt;p&gt;증가, 감소를 수행하는 기준은 (증가/감소시키므로서 될 코스트 - 현재까지의 코스트)를 구해서 더 코스트가 작은 액션을 수행하게 했습니다.&lt;/p&gt;
&lt;h2 id=&quot;풀이-코드&quot;&gt;풀이 코드&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;height &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; sorted&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n)])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;cost &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;n&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;l &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt; # 왼쪽 구간은 오른쪽 끝만 알고 있으면 된다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;r &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt; # 오른쪽 구간은 왼쪽 끝만 알고 있으면 된다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 초기 왼쪽 구간을 설정한다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; height[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; height[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    l &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 초기 오른쪽 구간을 설정한다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; height[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; height[&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    r &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; r &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;and&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; height[r] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; height[l] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 17&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  l_cost &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  r_cost &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # 왼쪽 구간을 증가시킴으로서 발생하는 비용 측정&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(l&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    l_cost &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (cost[i]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cost[i]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # 오른쪽 구간을 감소시킴으로서 발생하는 비용 측정  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, r&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    r_cost &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (cost[i]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cost[i]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l_cost &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; r_cost:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # 왼쪽 구간의 비용이 작은 경우 증가 액션 수행&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(l&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      cost[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      height[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # 오른쪽 구간의 비용이 작은 경우 감소 액션 수행&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, r&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      cost[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      height[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # 숫자를 증가시킴으로서, 구간이 확장되어야 하는지 검사&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; height[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; height[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      l &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # 숫자를 감소시킴으로서, 구간이 확장되어야 하는지 검사&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; height[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; height[&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      r &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;sum&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;([i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cost]))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;끝&lt;/p&gt;</content:encoded><category>BOJ</category><category>PS</category><category>sweeping</category><author>koa (김신건)</author></item><item><title>[BOJ] 14427 수열과 쿼리 15(2)</title><link>https://shinkeonkim.com/posts/problem-solving/boj/2021-10-17-boj-14427-2/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/problem-solving/boj/2021-10-17-boj-14427-2/</guid><description>boj-14427 글에서 평방 분할을 이용한 풀이를 끄적였는데, solved.ac 난이도 기여를 하러 들어갔더니</description><pubDate>Sun, 17 Oct 2021 02:42:08 GMT</pubDate><content:encoded>&lt;h2 id=&quot;문제-요약-및-풀이&quot;&gt;문제 요약 및 풀이&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14427&quot;&gt;14427번: 수열과 쿼리 15(2)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://shinkeonkim.com/posts/boj-14427/&quot;&gt;boj-14427&lt;/a&gt; 글에서 평방 분할을 이용한 풀이를 끄적였는데, solved.ac 난이도 기여를 하러 들어갔더니&lt;/p&gt;
&lt;p&gt;대부분의 의견이 세그먼트 트리 기준으로 난이도 기여를 하지말아달라는 것이었다.&lt;/p&gt;
&lt;p&gt;왤까 생각을 해보니.. 이 문제는 priority_queue로 간단하게 해결된다.&lt;/p&gt;
&lt;p&gt;일단, 다른 수열과 쿼리 문제와 다르게 이 문제는 특정 구간을 구하는 쿼리가 아닌 전체 구간의 최소값을 구하는 것이다.&lt;/p&gt;
&lt;p&gt;따라서 세그먼트 트리나 평방 분할같이 특정 구간의 대표값을 알아내는 쿼리 자료구조/알고리즘을 쓸 필요가 없었다.&lt;/p&gt;
&lt;p&gt;그냥 값들을 모조리 priority_queue에 넣어두고, 현재 해당 인덱스에 들어가있는 값과 priority_queue의 top()의 값이 제대로 성립하는지 확인하면서 top()값들을 출력하면 되었다.&lt;/p&gt;
&lt;h2 id=&quot;풀이-코드&quot;&gt;풀이 코드&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#include&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;#x3C;bits/stdc++.h&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#define&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;n; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;using&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; namespace&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ll;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pair&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ll, ll&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pll;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;priority_queue &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;pll, vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;pll&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, greater&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;pll&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Q;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ll N, M;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ll ar[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;110000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ll q, a, b;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  ios&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sync_with_stdio&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);cin.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tie&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);cout.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tie&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, N) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ar[i];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ ar[i], i});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; M;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(M&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; q;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(q &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b; a&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      ar[a] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      Q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({b, a});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;empty&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ar[Q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;().second] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;().first) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pop&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;().second &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded><category>BOJ</category><category>PS</category><category>수열과 쿼리</category><category>priority_queue</category><author>koa (김신건)</author></item><item><title>[BOJ] 14427 수열과 쿼리 15</title><link>https://shinkeonkim.com/posts/problem-solving/boj/2021-10-17-boj-14427/</link><guid isPermaLink="true">https://shinkeonkim.com/posts/problem-solving/boj/2021-10-17-boj-14427/</guid><description>오랜만에 세그먼트 트리를 복습하고자 본 문제였지만, 결국 제일 좋아하는 알고리즘이 된(?!) sqrt decomposition을 이용해 풀게 되었다.</description><pubDate>Sun, 17 Oct 2021 01:52:11 GMT</pubDate><content:encoded>&lt;h2 id=&quot;문제-요약-및-풀이&quot;&gt;문제 요약 및 풀이&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14427&quot;&gt;14427번: 수열과 쿼리 15&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://shinkeonkim.com/posts/boj-14427-2/&quot;&gt;다른 풀이 보러가기(풀고 나서, 더 생각하니 이 풀이는 너무나 닭 잡는데 소칼을 쓴 격이 되었다. )&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;오랜만에 세그먼트 트리를 복습하고자 본 문제였지만, 결국 제일 좋아하는 알고리즘이 된(?!) sqrt decomposition을 이용해 풀게 되었다.&lt;/p&gt;
&lt;p&gt;sqrt decomposition은 되게 어려워보이지만, 정말 간단한 아이디어로 어려운 상황을 해결할 수 있게 해준다.&lt;/p&gt;
&lt;p&gt;먼저 문제를 요약해보자.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;최대 길이가 10만인 수열 A가 주어지고 최대 10만인 M개의 쿼리에 대해서 수행해야 한다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;주어지는 쿼리는 아래 2개다.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1. i번쨰에 있는 숫자를 v로 변경해라.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2. 전체 수열의 최솟값의 인덱스를 출력하라.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;한번 모든 쿼리를 나이브하게 처리한다고 생각해보자.&lt;/p&gt;
&lt;p&gt;10만개의 숫자 중 최솟값을 최대 10만번 알아내야 하기 때문에, 10만 x 10만으로 100억이 된다. 무조건 시간초과가 뜬다.
(질문 목록을 보니 예전에는 나이브하게 풀리는 허점이 있었던 것 같긴 하다. 테케 추가되었으니 안 될듯?)&lt;/p&gt;
&lt;p&gt;그럼 여기에 sqrt decomposition 아이디어를 접목해보자.&lt;/p&gt;
&lt;p&gt;평방 분할의 큰 아이디어는 &lt;code&gt;여러 값들의 대표값을 sqrt(N)개 만큼 뽑아놓고 그값들을 갱신하고, 활용하자&lt;/code&gt; 라고 할 수 있다.&lt;/p&gt;
&lt;p&gt;N개의 값이 있고, $$ \sqrt N $$ 개만큼을 묶어서, $$ \sqrt N $$ 개 만큼의 대표값을 만든다.&lt;/p&gt;
&lt;p&gt;여기서 대표값은 $$ \sqrt N $$ 개 수의 최소값 및 최소값의 인덱스일 것이다.&lt;/p&gt;
&lt;p&gt;한번 쿼리를 처리해보자.&lt;/p&gt;
&lt;p&gt;1번 쿼리를 복잡하게 생각할 필요없이 그냥 $$ \sqrt N $$ 개의 숫자를 순회하면서 대표값을 갱신하면 된다.
(단, 해당 대표값은 바꿔야 하는 i번째 숫자가 포함된 구간의 대표값을 말하는것이다.)&lt;/p&gt;
&lt;p&gt;2번 쿼리는 정말 간단하게 모든 구간의 대표값을 순회하면서, 최소값과 최소값을 찾으면 된다.&lt;/p&gt;
&lt;p&gt;두 쿼리의 시간 복잡도는 $$ \sqrt N $$ 일 것이고, $$ N * \sqrt N $$ 는 최대 대략 10만 x 300 정도이고, 3000만은 충분히 1초내에 연산된다.&lt;/p&gt;
&lt;h2 id=&quot;풀이-코드&quot;&gt;풀이 코드&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#include&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;#x3C;bits/stdc++.h&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#define&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;n; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#define&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; INF&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;ll&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;11&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;using&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; namespace&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ll;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ll mo[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;110000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ll mo_idx[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;110000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ll ar[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;110000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ll N, sq, Q, q, a, b;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  ios&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sync_with_stdio&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);cin.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tie&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);cout.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tie&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  fill&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(mo, mo&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;N, INF);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  fill&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(mo_idx, mo_idx&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;N, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(sq &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; sq&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sq &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; N; sq&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, N) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ar[i];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(mo[i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sq] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ar[i]) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      mo[i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sq] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ar[i];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      mo_idx[i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sq] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Q;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(Q&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; q;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (q &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      cin &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      a&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      ar[a] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      ll partition &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sq;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      mo[partition] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; INF;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      mo_idx[partition] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;      for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(partition &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; sq, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;min&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((partition &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; sq, N)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(mo[i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sq] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ar[i]) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          mo[i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sq] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ar[i];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          mo_idx[i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sq] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      ll mn &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; INF;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      ll ret &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;      for1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, sq) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(mo[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; mn &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; mo_idx[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          mn &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; mo[i];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          ret &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; mo_idx[i];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      cout &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ret &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded><category>BOJ</category><category>PS</category><category>수열과 쿼리</category><category>평방 분할</category><author>koa (김신건)</author></item></channel></rss>