{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "김신건의 로그",
  "home_page_url": "https://shinkeonkim.com/",
  "feed_url": "https://shinkeonkim.com/feed.json",
  "description": "개발자 김신건(koa)의 개발 블로그, Python, Django, Astro, 알고리즘(백준/PS), 웹 개발, 데이터베이스를 기록하는 글·노트·위키.",
  "language": "ko-KR",
  "icon": "https://shinkeonkim.com/icon-512.png",
  "favicon": "https://shinkeonkim.com/favicon-32x32.png",
  "authors": [
    {
      "name": "koa (김신건)",
      "url": "https://shinkeonkim.com"
    }
  ],
  "items": [
    {
      "id": "https://shinkeonkim.com/posts/2026-07-15-file-descriptor-to-socket/",
      "url": "https://shinkeonkim.com/posts/2026-07-15-file-descriptor-to-socket/",
      "title": "파일 디스크립터부터 소켓까지, 하나로 이어지는 흐름",
      "summary": "파일도 소켓도 결국 fd 하나로 다뤄진다. open, read, write, close, socket, send 까지 하나의 흐름으로 이어보는 Unix I/O 의 통합 추상화.",
      "content_text": "파일도 소켓도 결국 fd 하나로 다뤄진다. open, read, write, close, socket, send 까지 하나의 흐름으로 이어보는 Unix I/O 의 통합 추상화.",
      "date_published": "2026-07-15T00:00:00.000Z",
      "tags": [
        "file-descriptor",
        "io",
        "socket",
        "unix",
        "linux",
        "system-call",
        "kernel",
        "network"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/2026-07-02-graph-density-tuning/",
      "url": "https://shinkeonkim.com/posts/2026-07-02-graph-density-tuning/",
      "title": "지식 그래프가 너무 빽빽했다: D3 force simulation 재튜닝",
      "summary": "/graph/ 페이지 노드가 서로 겹쳐 보이는 문제를, 파라미터 스케일링과 초기 zoom-to-fit, 라벨 가시성 게이팅으로 다시 잡은 과정.",
      "content_text": "/graph/ 페이지 노드가 서로 겹쳐 보이는 문제를, 파라미터 스케일링과 초기 zoom-to-fit, 라벨 가시성 게이팅으로 다시 잡은 과정.",
      "date_published": "2026-07-02T00:00:00.000Z",
      "tags": [
        "d3",
        "graph",
        "visualization",
        "force-simulation",
        "astro",
        "tuning"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/2026-06-29-rails-read-write-database-split/",
      "url": "https://shinkeonkim.com/posts/2026-06-29-rails-read-write-database-split/",
      "title": "Rails 에서의 Read/Write Database 분리",
      "summary": "Rails 의 Multiple Databases 기능으로 HTTP 메서드에 따라 read/write DB 를 자동 분리하는 패턴, GET 인데 쓰기가 필요할 때 ForceWrite concern 으로 role 을 일시 승격시키는 방법, 그리고 replication lag 등 실전 함정까지 정리합니다.",
      "content_text": "Rails 의 Multiple Databases 기능으로 HTTP 메서드에 따라 read/write DB 를 자동 분리하는 패턴, GET 인데 쓰기가 필요할 때 ForceWrite concern 으로 role 을 일시 승격시키는 방법, 그리고 replication lag 등 실전 함정까지 정리합니다.",
      "date_published": "2026-06-29T00:00:00.000Z",
      "tags": [
        "rails",
        "activerecord",
        "database",
        "read-replica",
        "scaling",
        "performance"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/2026-06-25-blog-dev-tools/",
      "url": "https://shinkeonkim.com/posts/2026-06-25-blog-dev-tools/",
      "title": "글 쓰는 즐거움을 위해 직접 만든 세 개의 도구: 에디터, 스튜디오, 차트 에디터",
      "summary": "shinkeonkim.com 안에 살고 있는 세 가지 개발 전용 도구의 기능을 한자리에 모았다. 마크다운 에디터, 애니메이션 스튜디오, Chart.js 에디터까지.",
      "content_text": "shinkeonkim.com 안에 살고 있는 세 가지 개발 전용 도구의 기능을 한자리에 모았다. 마크다운 에디터, 애니메이션 스튜디오, Chart.js 에디터까지.",
      "date_published": "2026-06-25T00:00:00.000Z",
      "tags": [
        "blog",
        "devtools",
        "editor",
        "studio",
        "chart",
        "astro"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/problem-solving/leetcode/algorithm/2804-array-prototype-foreach/",
      "url": "https://shinkeonkim.com/posts/problem-solving/leetcode/algorithm/2804-array-prototype-foreach/",
      "title": "[Leetcode] 2804 Array Prototype ForEach",
      "summary": "Leetcode 2804번 Array Prototype ForEach 풀이. callback 내부 this 를 context 로 바인딩하는 다섯 가지 방법 (call, apply, bind, 객체 메서드, 그리고 화살표 함수 함정) 을 비교한다.",
      "content_text": "Leetcode 2804번 Array Prototype ForEach 풀이. callback 내부 this 를 context 로 바인딩하는 다섯 가지 방법 (call, apply, bind, 객체 메서드, 그리고 화살표 함수 함정) 을 비교한다.",
      "date_published": "2026-06-18T05:00:00.000Z",
      "tags": [
        "Leetcode",
        "JavaScript",
        "this"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/2026-06-16-browser-communication/",
      "url": "https://shinkeonkim.com/posts/2026-06-16-browser-communication/",
      "title": "브라우저 기반 통신 총정리, HTTP부터 WebRTC까지, 어디에 부하가 가는가",
      "summary": "HTTP/1.1·2·3, Long Polling, Server-Sent Events, WebSocket, WebRTC, WebTransport를 Stateless/Stateful 관점에서 정리하고, 클라이언트·서버·네트워크 부하를 실측 수치로 비교한다.",
      "content_text": "HTTP/1.1·2·3, Long Polling, Server-Sent Events, WebSocket, WebRTC, WebTransport를 Stateless/Stateful 관점에서 정리하고, 클라이언트·서버·네트워크 부하를 실측 수치로 비교한다.",
      "date_published": "2026-06-16T00:00:00.000Z",
      "tags": [
        "http",
        "websocket",
        "sse",
        "webrtc",
        "networking",
        "browser",
        "web-api"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/2026-06-15-js-async-timing/",
      "url": "https://shinkeonkim.com/posts/2026-06-15-js-async-timing/",
      "title": "비동기와 타이밍, 콜백부터 async/await까지의 발전사",
      "summary": "싱글 스레드 JavaScript 가 어떻게 동시에 여러 일을 처리하는지, 이벤트 루프부터 Promise·async/await·AbortController·AsyncIterator 까지 메커니즘으로 풀어본다. setTimeout 0 이 왜 즉시가 아닌지, 마이크로태스크가 왜 먼저인지, 콜백이 왜 지옥이 되는지를 차례로 답한다.",
      "content_text": "싱글 스레드 JavaScript 가 어떻게 동시에 여러 일을 처리하는지, 이벤트 루프부터 Promise·async/await·AbortController·AsyncIterator 까지 메커니즘으로 풀어본다. setTimeout 0 이 왜 즉시가 아닌지, 마이크로태스크가 왜 먼저인지, 콜백이 왜 지옥이 되는지를 차례로 답한다.",
      "date_published": "2026-06-15T00:00:00.000Z",
      "tags": [
        "javascript",
        "async",
        "promise",
        "async-await",
        "event-loop",
        "settimeout",
        "microtask",
        "fetch",
        "generator"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/2026-06-16-cpu-gpu-tpu-npu/",
      "url": "https://shinkeonkim.com/posts/2026-06-16-cpu-gpu-tpu-npu/",
      "title": "CPU vs GPU vs TPU vs NPU, 네 종류 프로세서의 원리와 최근 동향",
      "summary": "같은 면적의 칩에 코어가 어떻게 다르게 배치되는지부터, 메모리 계층, 양자화, 최신 Trillium/Blackwell/NPU 동향, 그리고 컴퓨터 과학 패러다임에 미치는 영향까지.",
      "content_text": "같은 면적의 칩에 코어가 어떻게 다르게 배치되는지부터, 메모리 계층, 양자화, 최신 Trillium/Blackwell/NPU 동향, 그리고 컴퓨터 과학 패러다임에 미치는 영향까지.",
      "date_published": "2026-06-14T00:00:00.000Z",
      "tags": [
        "hardware",
        "cpu",
        "gpu",
        "tpu",
        "npu",
        "ai",
        "processor",
        "architecture"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/2026-06-13-lexical-environment-closure/",
      "url": "https://shinkeonkim.com/posts/2026-06-13-lexical-environment-closure/",
      "title": "함수는 끝났는데 변수가 살아있다, Lexical Environment와 클로저의 메커니즘",
      "summary": "스코프와 Environment 개념부터 차근차근 쌓아 naturals 이터레이터 예제의 세 가지 질문에 답해본다. n은 어디에 사는가, 왜 GC되지 않는가, 외부 변수와 어떻게 격리되는가.",
      "content_text": "스코프와 Environment 개념부터 차근차근 쌓아 naturals 이터레이터 예제의 세 가지 질문에 답해본다. n은 어디에 사는가, 왜 GC되지 않는가, 외부 변수와 어떻게 격리되는가.",
      "date_published": "2026-06-13T00:00:00.000Z",
      "tags": [
        "javascript",
        "typescript",
        "closure",
        "lexical-environment",
        "ecmascript",
        "internals"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/2026-06-13-sort-hash-memory-spill/",
      "url": "https://shinkeonkim.com/posts/2026-06-13-sort-hash-memory-spill/",
      "title": "정렬·해시는 메모리가 부족하면 어디로 새는가, PGA, work_mem, Workspace Memory",
      "summary": "\"SQL 레벨업\"이 한 문장으로 압축한 정렬·해시의 메모리 spill을, 알고리즘부터 Oracle·PostgreSQL·SQL Server의 실제 동작까지 단계별로 풀어본다.",
      "content_text": "\"SQL 레벨업\"이 한 문장으로 압축한 정렬·해시의 메모리 spill을, 알고리즘부터 Oracle·PostgreSQL·SQL Server의 실제 동작까지 단계별로 풀어본다.",
      "date_published": "2026-06-13T00:00:00.000Z",
      "tags": [
        "oracle",
        "postgresql",
        "sqlserver",
        "sort",
        "hash",
        "memory",
        "internals"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/2026-06-13-sparse-column-benchmark-01/",
      "url": "https://shinkeonkim.com/posts/2026-06-13-sparse-column-benchmark-01/",
      "title": "UNION vs OR vs IN 벤치마크 (1), 실험 설계와 결과",
      "summary": "\"SQL 레벨업\"에서 UNION을 권장하는 패턴을 PostgreSQL/MySQL 6개 버전에서 실측한 결과. MySQL에서는 900배 차이가 난다.",
      "content_text": "\"SQL 레벨업\"에서 UNION을 권장하는 패턴을 PostgreSQL/MySQL 6개 버전에서 실측한 결과. MySQL에서는 900배 차이가 난다.",
      "date_published": "2026-06-13T00:00:00.000Z",
      "tags": [
        "postgresql",
        "mysql",
        "benchmark",
        "index",
        "sql"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/2026-06-13-sparse-column-benchmark-02/",
      "url": "https://shinkeonkim.com/posts/2026-06-13-sparse-column-benchmark-02/",
      "title": "UNION vs OR vs IN 벤치마크 (2), PostgreSQL BitmapOr 완전 해부",
      "summary": "PostgreSQL이 서로 다른 컬럼의 OR 조건에서도 모든 인덱스를 활용할 수 있는 비밀: Bitmap Scan의 동작 원리와 TID Bitmap 내부 구조를 해부한다.",
      "content_text": "PostgreSQL이 서로 다른 컬럼의 OR 조건에서도 모든 인덱스를 활용할 수 있는 비밀: Bitmap Scan의 동작 원리와 TID Bitmap 내부 구조를 해부한다.",
      "date_published": "2026-06-13T00:00:00.000Z",
      "tags": [
        "postgresql",
        "index",
        "bitmap-scan",
        "internals"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/2026-06-13-sparse-column-benchmark-03/",
      "url": "https://shinkeonkim.com/posts/2026-06-13-sparse-column-benchmark-03/",
      "title": "UNION vs OR vs IN 벤치마크 (3), 전체 데이터와 실무 권고",
      "summary": "PostgreSQL 3버전 + MySQL 3버전의 전체 측정 데이터와, 이 결과를 실무에 어떻게 적용할지 정리한다.",
      "content_text": "PostgreSQL 3버전 + MySQL 3버전의 전체 측정 데이터와, 이 결과를 실무에 어떻게 적용할지 정리한다.",
      "date_published": "2026-06-13T00:00:00.000Z",
      "tags": [
        "postgresql",
        "mysql",
        "benchmark",
        "sql"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/iac-tutorial/",
      "url": "https://shinkeonkim.com/posts/iac-tutorial/",
      "title": "IaC 튜토리얼 (1)",
      "summary": "IaC(Infrastructure as Code) 개념과 도구들을 소개하는 튜토리얼",
      "content_text": "IaC(Infrastructure as Code) 개념과 도구들을 소개하는 튜토리얼",
      "date_published": "2026-06-12T00:00:00.000Z",
      "date_modified": "2026-06-12T00:00:00.000Z",
      "tags": [
        "tutorial",
        "IaC"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/books/multi-paradigm-programming/multi-paradigm-programming-note/",
      "url": "https://shinkeonkim.com/posts/books/multi-paradigm-programming/multi-paradigm-programming-note/",
      "title": "멀티 패러다임 프로그래밍 책을 읽으며 끄적이기",
      "summary": "",
      "content_text": "",
      "date_published": "2026-06-04T00:00:00.000Z",
      "tags": [],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/code-with-output-showcase/",
      "url": "https://shinkeonkim.com/posts/code-with-output-showcase/",
      "title": "CodeWithOutput 컴포넌트 데모",
      "summary": "CodeWithOutput 컴포넌트가 지원하는 모든 사용 패턴, 단일/다중 STDIN·STDOUT, 다중 언어 변형, 라벨/타이틀, 반응형, 엣지 케이스까지 한 번에 확인할 수 있도록 모아둔 데모 페이지.",
      "content_text": "CodeWithOutput 컴포넌트가 지원하는 모든 사용 패턴, 단일/다중 STDIN·STDOUT, 다중 언어 변형, 라벨/타이틀, 반응형, 엣지 케이스까지 한 번에 확인할 수 있도록 모아둔 데모 페이지.",
      "date_published": "2026-05-26T00:00:00.000Z",
      "date_modified": "2026-05-26T00:00:00.000Z",
      "tags": [
        "meta",
        "demo"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/problem-solving/leetcode/shell/192-word-frequency/",
      "url": "https://shinkeonkim.com/posts/problem-solving/leetcode/shell/192-word-frequency/",
      "title": "[Leetcode] 192 Word Frequency",
      "summary": "Leetcode 192번 문제 풀이입니다.",
      "content_text": "Leetcode 192번 문제 풀이입니다.",
      "date_published": "2026-05-25T09:35:44.000Z",
      "tags": [
        "Leetcode"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/problem-solving/leetcode/shell/195-tenth-line/",
      "url": "https://shinkeonkim.com/posts/problem-solving/leetcode/shell/195-tenth-line/",
      "title": "[Leetcode] 195 Tenth Line",
      "summary": "Leetcode 195번 문제 풀이입니다.",
      "content_text": "Leetcode 195번 문제 풀이입니다.",
      "date_published": "2026-05-25T09:14:23.000Z",
      "tags": [
        "Leetcode"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/problem-solving/leetcode/shell/193-valid-phone-numbers/",
      "url": "https://shinkeonkim.com/posts/problem-solving/leetcode/shell/193-valid-phone-numbers/",
      "title": "[Leetcode] 193 Valid Phone Numbers",
      "summary": "Leetcode 193번 문제 풀이입니다.",
      "content_text": "Leetcode 193번 문제 풀이입니다.",
      "date_published": "2026-05-25T08:14:00.000Z",
      "tags": [
        "Leetcode"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/2026-05-24-cache-pros/",
      "url": "https://shinkeonkim.com/posts/2026-05-24-cache-pros/",
      "title": "캐시 적용이 적절한 상황",
      "summary": "캐시 적용이 적절한 상황에 대해",
      "content_text": "캐시 적용이 적절한 상황에 대해",
      "date_published": "2026-05-24T09:26:00.000Z",
      "tags": [],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/markdown-kitchen-sink/",
      "url": "https://shinkeonkim.com/posts/markdown-kitchen-sink/",
      "title": "마크다운 문법 종합 테스트",
      "summary": "Astro + remark 플러그인 조합에서 어떤 마크다운 문법이 동작하는지 정리한 데모 페이지.",
      "content_text": "Astro + remark 플러그인 조합에서 어떤 마크다운 문법이 동작하는지 정리한 데모 페이지.",
      "date_published": "2026-05-23T00:00:00.000Z",
      "date_modified": "2026-05-23T00:00:00.000Z",
      "tags": [
        "meta",
        "markdown",
        "demo"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/scaling-blog-to-10k-posts/",
      "url": "https://shinkeonkim.com/posts/scaling-blog-to-10k-posts/",
      "title": "1만 개의 글에서도 빠르게: 블로그 빌드 성능 최적화 회고",
      "summary": "Astro 블로그가 1만 개 문서를 안전하게 다루기 위해 O(N²) 빌드 병목을 잡고 그래프/검색을 손본 과정과 교훈.",
      "content_text": "Astro 블로그가 1만 개 문서를 안전하게 다루기 위해 O(N²) 빌드 병목을 잡고 그래프/검색을 손본 과정과 교훈.",
      "date_published": "2026-05-23T00:00:00.000Z",
      "date_modified": "2026-05-23T00:00:00.000Z",
      "tags": [
        "perf",
        "build",
        "astro",
        "optimization",
        "retrospective"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/my-life/2025-12-31-goodbye-2025/",
      "url": "https://shinkeonkim.com/posts/my-life/2025-12-31-goodbye-2025/",
      "title": "2025년 회고록 - 개발자에서 학생으로 돌아가서, 2025년을 정리하며",
      "content_text": "",
      "date_published": "2025-12-31T04:30:00.000Z",
      "tags": [
        "회고록"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/atcoder/2025-03-30-abc-399/",
      "url": "https://shinkeonkim.com/posts/atcoder/2025-03-30-abc-399/",
      "title": "Atcoder Beginner Contest 399 후기",
      "summary": "2025년 3월 30일에 진행된 Atcoder Beginner Contest 399에서 풀이한 문제들과 풀이 방법, 그리고 대회 경험을 공유하는 후기입니다.",
      "content_text": "2025년 3월 30일에 진행된 Atcoder Beginner Contest 399에서 풀이한 문제들과 풀이 방법, 그리고 대회 경험을 공유하는 후기입니다.",
      "date_published": "2025-03-30T10:00:00.000Z",
      "tags": [
        "atcoder",
        "문제풀이"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/atcoder/2025-03-23-abc-398/",
      "url": "https://shinkeonkim.com/posts/atcoder/2025-03-23-abc-398/",
      "title": "Atcoder Beginner Contest 398 후기",
      "summary": "2025년 3월 22일에 진행된 Atcoder Beginner Contest 398에서 풀이한 문제들과 풀이 방법, 그리고 대회 경험을 공유하는 후기입니다.",
      "content_text": "2025년 3월 22일에 진행된 Atcoder Beginner Contest 398에서 풀이한 문제들과 풀이 방법, 그리고 대회 경험을 공유하는 후기입니다.",
      "date_published": "2025-03-23T02:20:00.000Z",
      "tags": [
        "atcoder",
        "문제풀이"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/atcoder/2025-03-09-abc-396/",
      "url": "https://shinkeonkim.com/posts/atcoder/2025-03-09-abc-396/",
      "title": "Atcoder Beginner Contest 396 후기",
      "summary": "2025년 3월 8일에 진행된 Atcoder Beginner Contest 396에서 풀이한 문제들과 풀이 방법, 그리고 대회 경험을 공유하는 후기입니다.",
      "content_text": "2025년 3월 8일에 진행된 Atcoder Beginner Contest 396에서 풀이한 문제들과 풀이 방법, 그리고 대회 경험을 공유하는 후기입니다.",
      "date_published": "2025-03-09T09:20:00.000Z",
      "tags": [
        "atcoder",
        "문제풀이"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/atcoder/2025-03-02-abc-395/",
      "url": "https://shinkeonkim.com/posts/atcoder/2025-03-02-abc-395/",
      "title": "Atcoder Beginner Contest 395 후기",
      "summary": "2025년 3월 1일에 진행된 Atcoder Beginner Contest 395에서 풀이한 문제들과 풀이 방법, 그리고 대회 경험을 공유하는 후기입니다.",
      "content_text": "2025년 3월 1일에 진행된 Atcoder Beginner Contest 395에서 풀이한 문제들과 풀이 방법, 그리고 대회 경험을 공유하는 후기입니다.",
      "date_published": "2025-03-02T02:50:00.000Z",
      "tags": [
        "atcoder",
        "문제풀이"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/my-life/2025-02-26-grepp-memoir/",
      "url": "https://shinkeonkim.com/posts/my-life/2025-02-26-grepp-memoir/",
      "title": "새로운 시작을 준비하며, 그렙을 떠나 다시 학교로 돌아갑니다",
      "summary": "그렙에서의 지난 여정을 돌아보며, 앞으로의 새로운 도전을 위해 대학으로 복학하기로 한 결심과 그 배경에 대해 공유하는 회고록입니다.",
      "content_text": "그렙에서의 지난 여정을 돌아보며, 앞으로의 새로운 도전을 위해 대학으로 복학하기로 한 결심과 그 배경에 대해 공유하는 회고록입니다.",
      "date_published": "2025-02-26T04:25:00.000Z",
      "date_modified": "2025-02-26T04:25:00.000Z",
      "tags": [
        "회고록",
        "그렙",
        "프로그래머스"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/atcoder/2025-02-23-abc-394/",
      "url": "https://shinkeonkim.com/posts/atcoder/2025-02-23-abc-394/",
      "title": "Atcoder Beginner Contest 394 후기",
      "summary": "2025년 2월 22일에 진행된 Atcoder Beginner Contest 394에서 풀이한 문제들과 풀이 방법, 그리고 대회 경험을 공유하는 후기입니다.",
      "content_text": "2025년 2월 22일에 진행된 Atcoder Beginner Contest 394에서 풀이한 문제들과 풀이 방법, 그리고 대회 경험을 공유하는 후기입니다.",
      "date_published": "2025-02-23T05:00:00.000Z",
      "tags": [
        "atcoder",
        "문제풀이"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/my-life/2024-05-28-army-memoir/",
      "url": "https://shinkeonkim.com/posts/my-life/2024-05-28-army-memoir/",
      "title": "2022년 11월부터 시작된 1년 6개월 회고록",
      "summary": "군대에서의 1년 6개월을 돌아보며, 그 기간 동안의 공부와 앞으로의 계획에 대해 정리한 회고록입니다.",
      "content_text": "군대에서의 1년 6개월을 돌아보며, 그 기간 동안의 공부와 앞으로의 계획에 대해 정리한 회고록입니다.",
      "date_published": "2024-05-28T06:00:00.000Z",
      "date_modified": "2024-05-28T06:00:00.000Z",
      "tags": [
        "회고록",
        "군대"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/problem-solving/boj/2023-09-20-boj-19496/",
      "url": "https://shinkeonkim.com/posts/problem-solving/boj/2023-09-20-boj-19496/",
      "title": "[BOJ] 16496 큰 수 만들기",
      "summary": "야간 당직을 서면서 직접 숫자를 만들어 나열해가다가, 아이디어가 떠올랐다.",
      "content_text": "야간 당직을 서면서 직접 숫자를 만들어 나열해가다가, 아이디어가 떠올랐다.",
      "date_published": "2023-09-20T14:03:00.000Z",
      "tags": [
        "BOJ",
        "PS",
        "Sorting"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/problem-solving/boj/2023-09-10-boj-16940/",
      "url": "https://shinkeonkim.com/posts/problem-solving/boj/2023-09-10-boj-16940/",
      "title": "[BOJ] 16940 BFS 스페셜 저지",
      "summary": "트리가 주어지고, 노드들을 탐색한 순서가 주어진다. 이때, 탐색한 순서가 BFS 탐색으로 가능한 순서가 맞는지 검증하면 된다.",
      "content_text": "트리가 주어지고, 노드들을 탐색한 순서가 주어진다. 이때, 탐색한 순서가 BFS 탐색으로 가능한 순서가 맞는지 검증하면 된다.",
      "date_published": "2023-09-10T04:00:00.000Z",
      "tags": [
        "BOJ",
        "PS",
        "DP"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/problem-solving/boj/2023-05-27-boj-2618/",
      "url": "https://shinkeonkim.com/posts/problem-solving/boj/2023-05-27-boj-2618/",
      "title": "[BOJ] 2618 경찰차",
      "summary": "이때, 두 경찰차가 이동하는 최소 거리를 구해야 한다.",
      "content_text": "이때, 두 경찰차가 이동하는 최소 거리를 구해야 한다.",
      "date_published": "2023-05-27T09:23:00.000Z",
      "tags": [
        "BOJ",
        "PS",
        "DP"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/my-life/2022-10-30-goodbye-2022/",
      "url": "https://shinkeonkim.com/posts/my-life/2022-10-30-goodbye-2022/",
      "title": "2년차 주니어 개발자 / 휴학생 / 예비 군인의 미리 쓰는 2022년 회고록",
      "summary": "2년차 주니어 개발자, 휴학생, 예비 군인 등 많은 수식어가 생긴 올해의 회고록은 일찍 써보려 한다.",
      "content_text": "2년차 주니어 개발자, 휴학생, 예비 군인 등 많은 수식어가 생긴 올해의 회고록은 일찍 써보려 한다.",
      "date_published": "2022-10-30T07:05:00.000Z",
      "tags": [
        "회고록",
        "주니어 개발자"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/problem-solving/boj/2022-05-05-boj-16942/",
      "url": "https://shinkeonkim.com/posts/problem-solving/boj/2022-05-05-boj-16942/",
      "title": "[BOJ] 16942 문자열 접기",
      "summary": "주어지는 문자열을 접어서, 같은 문자열로만 이루어지는 문자열을 만들어내면 된다.",
      "content_text": "주어지는 문자열을 접어서, 같은 문자열로만 이루어지는 문자열을 만들어내면 된다.",
      "date_published": "2022-05-05T03:16:14.000Z",
      "tags": [
        "BOJ",
        "PS",
        "DP"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/problem-solving/boj/2022-01-08-boj-19718/",
      "url": "https://shinkeonkim.com/posts/problem-solving/boj/2022-01-08-boj-19718/",
      "title": "[BOJ] 19718 King's Inspection",
      "summary": "문제 상황을 요약하면 다음과 같다.",
      "content_text": "문제 상황을 요약하면 다음과 같다.",
      "date_published": "2022-01-08T09:33:10.000Z",
      "tags": [
        "BOJ",
        "PS",
        "Greedy"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/til/2021-12-19-til-responsive-animation/",
      "url": "https://shinkeonkim.com/posts/til/2021-12-19-til-responsive-animation/",
      "title": "[TIL] Window size에 따라 속도가 달라지는 CSS Animation 바로잡기",
      "summary": "새벽에 어쩌다 떠오른 아이디어로 짧고 굵게 토이 프로젝트를 진행해보고 있다.",
      "content_text": "새벽에 어쩌다 떠오른 아이디어로 짧고 굵게 토이 프로젝트를 진행해보고 있다.",
      "date_published": "2021-12-19T09:38:16.000Z",
      "tags": [
        "TIL",
        "CSS",
        "CSS Animation",
        "Vue.js"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/til/2021-12-14-til-django-get_random_string/",
      "url": "https://shinkeonkim.com/posts/til/2021-12-14-til-django-get_random_string/",
      "title": "[TIL] Django Alphanumeric Random String 생성하기",
      "summary": "웹 서비스를 구성하다보면, 종종 랜덤 문자열을 뽑아내야 하는 경우가 있다.",
      "content_text": "웹 서비스를 구성하다보면, 종종 랜덤 문자열을 뽑아내야 하는 경우가 있다.",
      "date_published": "2021-12-14T12:40:53.000Z",
      "tags": [
        "TIL",
        "python",
        "Django",
        "random"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/my-life/2021-12-09-goodbye-2021/",
      "url": "https://shinkeonkim.com/posts/my-life/2021-12-09-goodbye-2021/",
      "title": "대학교 2학년 휴학생, 회사에서 2021년 회고록",
      "summary": "한달, 아니 적어도 분기마다 회고록을 쓰려고 했지만.. 항상 키보드를 잡다가, 포기해왔다. 하지만 올해는 마무리 지어야하기에 끄적여본다.",
      "content_text": "한달, 아니 적어도 분기마다 회고록을 쓰려고 했지만.. 항상 키보드를 잡다가, 포기해왔다. 하지만 올해는 마무리 지어야하기에 끄적여본다.",
      "date_published": "2021-12-09T00:00:00.000Z",
      "tags": [
        "회고록",
        "주니어 개발자"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/til/2021-11-18-til-slack-web-hook-and-github-action/",
      "url": "https://shinkeonkim.com/posts/til/2021-11-18-til-slack-web-hook-and-github-action/",
      "title": "[TIL] 슬랙 웹훅과 깃헙 액션을 이용해 알림 봇 만들기",
      "summary": "국민대학교 멋쟁이사자처럼에서 슬랙을 사용하기로 했고, 내부 스터디인 줌터디도 슬랙에서 활동을 하게되었다. 이때, 특정 시간마다 회고글을 쓰라는 메세지가 주기적으로 오는 봇이 있으면 좋겠다고 생각이 들었다.",
      "content_text": "국민대학교 멋쟁이사자처럼에서 슬랙을 사용하기로 했고, 내부 스터디인 줌터디도 슬랙에서 활동을 하게되었다. 이때, 특정 시간마다 회고글을 쓰라는 메세지가 주기적으로 오는 봇이 있으면 좋겠다고 생각이 들었다.",
      "date_published": "2021-11-18T11:02:09.000Z",
      "tags": [
        "TIL",
        "슬랙 webhook",
        "Github action"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/problem-solving/boj/2021-11-08-boj-15087/",
      "url": "https://shinkeonkim.com/posts/problem-solving/boj/2021-11-08-boj-15087/",
      "title": "[BOJ] 15087 DRM Messages",
      "summary": "- python에서 ord, chr을 잘 활용하자. - 단계별로 최대한 함수를 나누어 구현해보면, 더 쉽게 문제가 해결된다.",
      "content_text": "- python에서 ord, chr을 잘 활용하자. - 단계별로 최대한 함수를 나누어 구현해보면, 더 쉽게 문제가 해결된다.",
      "date_published": "2021-11-08T06:42:51.000Z",
      "tags": [
        "BOJ",
        "PS",
        "구현"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/problem-solving/boj/2021-10-23-boj-9881/",
      "url": "https://shinkeonkim.com/posts/problem-solving/boj/2021-10-23-boj-9881/",
      "title": "[BOJ] 9881 Ski Course Design",
      "summary": "문제를 간단?하게 요약/번역해보자.",
      "content_text": "문제를 간단?하게 요약/번역해보자.",
      "date_published": "2021-10-23T08:05:14.000Z",
      "tags": [
        "BOJ",
        "PS",
        "sweeping"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/problem-solving/boj/2021-10-17-boj-14427-2/",
      "url": "https://shinkeonkim.com/posts/problem-solving/boj/2021-10-17-boj-14427-2/",
      "title": "[BOJ] 14427 수열과 쿼리 15(2)",
      "summary": "boj-14427 글에서 평방 분할을 이용한 풀이를 끄적였는데, solved.ac 난이도 기여를 하러 들어갔더니",
      "content_text": "boj-14427 글에서 평방 분할을 이용한 풀이를 끄적였는데, solved.ac 난이도 기여를 하러 들어갔더니",
      "date_published": "2021-10-17T02:42:08.000Z",
      "tags": [
        "BOJ",
        "PS",
        "수열과 쿼리",
        "priority_queue"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/problem-solving/boj/2021-10-17-boj-14427/",
      "url": "https://shinkeonkim.com/posts/problem-solving/boj/2021-10-17-boj-14427/",
      "title": "[BOJ] 14427 수열과 쿼리 15",
      "summary": "오랜만에 세그먼트 트리를 복습하고자 본 문제였지만, 결국 제일 좋아하는 알고리즘이 된(?!) sqrt decomposition을 이용해 풀게 되었다.",
      "content_text": "오랜만에 세그먼트 트리를 복습하고자 본 문제였지만, 결국 제일 좋아하는 알고리즘이 된(?!) sqrt decomposition을 이용해 풀게 되었다.",
      "date_published": "2021-10-17T01:52:11.000Z",
      "tags": [
        "BOJ",
        "PS",
        "수열과 쿼리",
        "평방 분할"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/problem-solving/boj/2021-10-13-boj-19572/",
      "url": "https://shinkeonkim.com/posts/problem-solving/boj/2021-10-13-boj-19572/",
      "title": "[BOJ] 19572 가뭄(small)",
      "summary": "연립방정식을 풀자.",
      "content_text": "연립방정식을 풀자.",
      "date_published": "2021-10-13T10:01:50.000Z",
      "tags": [
        "BOJ",
        "PS",
        "math"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/css-battle/2021-10-10-css-battle-07/",
      "url": "https://shinkeonkim.com/posts/css-battle/2021-10-10-css-battle-07/",
      "title": "[CSSBattle] Target #7 - Leafy Trail",
      "summary": "동일한 잎 모양의 도형이 3개 반복된다. box-shadow를 이용해서, 간단하게 처리하자!",
      "content_text": "동일한 잎 모양의 도형이 3개 반복된다. box-shadow를 이용해서, 간단하게 처리하자!",
      "date_published": "2021-10-10T09:48:02.000Z",
      "tags": [
        "CSSBattle",
        "CSS"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/css-battle/2021-10-10-css-battle-06/",
      "url": "https://shinkeonkim.com/posts/css-battle/2021-10-10-css-battle-06/",
      "title": "[CSSBattle] Target #6 - Missing Slice",
      "summary": "이것도 특이한 아이디어는 없다.",
      "content_text": "이것도 특이한 아이디어는 없다.",
      "date_published": "2021-10-10T09:24:41.000Z",
      "tags": [
        "CSSBattle",
        "CSS"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/css-battle/2021-10-10-css-battle-05/",
      "url": "https://shinkeonkim.com/posts/css-battle/2021-10-10-css-battle-05/",
      "title": "[CSSBattle] Target #5 - Acid Rain",
      "summary": "일단 빗방울 같이 생긴 도형 2개는 box-shadow를 이용해서, 같이 처리하면 될 것 같았다. 문제는 오른쪽 원이었고, border-radius가 달랐기에 새로 하나 만들고, 픽셀로 계산해서 조절해서 넣자 생각을 했다.",
      "content_text": "일단 빗방울 같이 생긴 도형 2개는 box-shadow를 이용해서, 같이 처리하면 될 것 같았다. 문제는 오른쪽 원이었고, border-radius가 달랐기에 새로 하나 만들고, 픽셀로 계산해서 조절해서 넣자 생각을 했다.",
      "date_published": "2021-10-10T08:48:18.000Z",
      "tags": [
        "CSSBattle",
        "CSS"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/css-battle/2021-10-10-css-battle-04/",
      "url": "https://shinkeonkim.com/posts/css-battle/2021-10-10-css-battle-04/",
      "title": "[CSSBattle] Target #4 - Ups n Downs",
      "summary": "보자마자 일단 6개의 구역을 나누고, 짝수번째인것의 색상을 바꾸자 라는 생각부터 들었다.",
      "content_text": "보자마자 일단 6개의 구역을 나누고, 짝수번째인것의 색상을 바꾸자 라는 생각부터 들었다.",
      "date_published": "2021-10-10T08:35:52.000Z",
      "tags": [
        "CSSBattle",
        "CSS"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    },
    {
      "id": "https://shinkeonkim.com/posts/css-battle/2021-10-10-css-battle-03/",
      "url": "https://shinkeonkim.com/posts/css-battle/2021-10-10-css-battle-03/",
      "title": "[CSSBattle] Target #3 - Push Button",
      "summary": "얼핏보면 원을 여러모로 많이 만들어야 하는 풀이로 풀 수도 있다.",
      "content_text": "얼핏보면 원을 여러모로 많이 만들어야 하는 풀이로 풀 수도 있다.",
      "date_published": "2021-10-10T08:17:52.000Z",
      "tags": [
        "CSSBattle",
        "CSS"
      ],
      "authors": [
        {
          "name": "koa (김신건)",
          "url": "https://shinkeonkim.com"
        }
      ]
    }
  ]
}