<feed xmlns="http://www.w3.org/2005/Atom"> <id>https://moonjs1011.github.io/</id><title>sung1</title><subtitle>develop and stduy something..</subtitle> <updated>2026-04-10T13:02:14+09:00</updated> <author> <name>Sung Won Moon</name> <uri>https://moonjs1011.github.io/</uri> </author><link rel="self" type="application/atom+xml" href="https://moonjs1011.github.io/feed.xml"/><link rel="alternate" type="text/html" hreflang="en" href="https://moonjs1011.github.io/"/> <generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator> <rights> © 2026 Sung Won Moon </rights> <icon>/assets/img/favicons/favicon.ico</icon> <logo>/assets/img/favicons/favicon-96x96.png</logo> <entry><title>SWEA 2383 점심 식사시간 (Java)</title><link href="https://moonjs1011.github.io/posts/swea-2383-lunch-time/" rel="alternate" type="text/html" title="SWEA 2383 점심 식사시간 (Java)" /><published>2026-04-10T00:00:00+09:00</published> <updated>2026-04-10T00:00:00+09:00</updated> <id>https://moonjs1011.github.io/posts/swea-2383-lunch-time/</id> <content type="text/html" src="https://moonjs1011.github.io/posts/swea-2383-lunch-time/" /> <author> <name>Sung Won Moon</name> </author> <category term="ProblemSolving" /> <summary>SWEA 2383: 점심 식사시간 풀이 정리 문제 조건 분석 계단을 내려가는 시뮬레이션에서 가장 중요한 규칙들을 정리합니다. 계단 입구까지의 이동 시간 사람($P$)에서 계단 입구($S$)까지 가는 시간은 맨해튼 거리로 계산합니다. $이동 시간 = PR - SR + PC - SC $ 계단을 내려가는 규칙 대기 시간: 계단 입구에 도착한 후 1분 뒤부터 계단에 진입할 수 있습니다. 동시 수용 인원: 한 계단에는 최대 3명만 동시에 존재할 수 있습니다. 소요 시간: 계단 길이 $K$만큼 시간이 지나야 완전...</summary> </entry> <entry><title>피보나치 - 행렬 거듭제곱으로 O(log N) 풀기</title><link href="https://moonjs1011.github.io/posts/fibonacci-matrix-exponentiation/" rel="alternate" type="text/html" title="피보나치 - 행렬 거듭제곱으로 O(log N) 풀기" /><published>2026-03-23T00:00:00+09:00</published> <updated>2026-04-10T13:01:50+09:00</updated> <id>https://moonjs1011.github.io/posts/fibonacci-matrix-exponentiation/</id> <content type="text/html" src="https://moonjs1011.github.io/posts/fibonacci-matrix-exponentiation/" /> <author> <name>Sung Won Moon</name> </author> <category term="Algorithm" /> <category term="DivideAndConquer" /> <summary>문제 조건에서 N은 1,000,000,000,000,000,000까지 주어진다. 즉, int는 물론이고 일반적인 선형 DP로도 감당하기 어려운 크기다. 게다가 결과는 1,000,000,007로 나눈 값을 출력해야 한다. 처음 이 문제를 봤을 때는 익숙한 피보나치 문제처럼 보였지만, 입력 범위를 보는 순간 평소 방식으로는 안 되겠다고 생각했다. 이 문제를 풀기까지 어떤 가설을 세웠고, 왜 그 접근이 막히는지부터 정리해본다. DP(Bottom-up) 풀이를 먼저 떠올린 이유 피보나치 수열 문제를 보면 가장 먼저 DP를 떠올리게 된다. 점화식 자체가 너무 익숙하기 때문이다. [F(n) = F(n-1) + F(n-2)] 처음에는 재귀 기반 Top-down 풀이를 생각했지만, N의 크기를 보면 재귀 호...</summary> </entry> <entry><title>세그먼트 트리로 구간합과 포인트 업데이트 처리하기</title><link href="https://moonjs1011.github.io/posts/segment-tree/" rel="alternate" type="text/html" title="세그먼트 트리로 구간합과 포인트 업데이트 처리하기" /><published>2026-03-14T00:00:00+09:00</published> <updated>2026-04-10T13:01:50+09:00</updated> <id>https://moonjs1011.github.io/posts/segment-tree/</id> <content type="text/html" src="https://moonjs1011.github.io/posts/segment-tree/" /> <author> <name>Sung Won Moon</name> </author> <category term="Algorithm" /> <category term="DataStructure" /> <summary>구간 합 질의가 잦은데 값도 자주 바뀌는 문제를 풀면서 세그먼트 트리를 다시 손에 익혔다. 스터디 때 쓴 자바 코드를 정리해둔다. 노드 의미와 배열 인덱싱 segmentTree[node]는 구간 [nodeL, nodeR] 합을 담는다. 부모의 왼쪽·오른쪽 자식 인덱스는 2*node, 2*node+1. 트리 크기는 안전하게 4*N 배열을 잡는다. 핵심 코드 long query(int node, int l, int r, int ql, int qr) { if (qr &amp;lt; l || r &amp;lt; ql) return 0; if (ql &amp;lt;= l &amp;amp;&amp;amp; r &amp;lt;= qr) return segmentTree[node]; int mid = (l + r) / 2; r...</summary> </entry> <entry><title>LCS - 순수 재귀 vs 메모이제이션 성능 비교</title><link href="https://moonjs1011.github.io/posts/lcs-memoization/" rel="alternate" type="text/html" title="LCS - 순수 재귀 vs 메모이제이션 성능 비교" /><published>2026-03-13T00:00:00+09:00</published> <updated>2026-04-10T13:01:50+09:00</updated> <id>https://moonjs1011.github.io/posts/lcs-memoization/</id> <content type="text/html" src="https://moonjs1011.github.io/posts/lcs-memoization/" /> <author> <name>Sung Won Moon</name> </author> <category term="Algorithm" /> <category term="DynamicProgramming" /> <summary>두 문자열의 최장 공통 부분수열(LCS)을 풀다가, 캐시를 켜고 끈 상태가 얼마나 다른지 직접 찍어봤다. 손에 익힌 느낌을 적어둔다. 문제와 기초 재귀 기본 재귀식은 다음과 같다. 문자가 같으면 1을 더하고, 아니면 두 가지 분기를 비교한다. int LCS(int i, int j) { if (i == n || j == m) return 0; if (a.charAt(i) == b.charAt(j)) return 1 + LCS(i+1, j+1); return Math.max(LCS(i+1, j), LCS(i, j+1)); } 이 방식은 동일한 (i,j)를 수없이 다시 계산해 O(2^(n+m)) 수준까지 폭발한다. 메모이제이션 테이블 boolean[][] isCached와 int[][] ...</summary> </entry> <entry><title>다익스트라 + 우선순위큐로 특정 경유 최단경로 구하기</title><link href="https://moonjs1011.github.io/posts/dijkstra-priority-queue/" rel="alternate" type="text/html" title="다익스트라 + 우선순위큐로 특정 경유 최단경로 구하기" /><published>2026-03-12T00:00:00+09:00</published> <updated>2026-04-10T13:01:50+09:00</updated> <id>https://moonjs1011.github.io/posts/dijkstra-priority-queue/</id> <content type="text/html" src="https://moonjs1011.github.io/posts/dijkstra-priority-queue/" /> <author> <name>Sung Won Moon</name> </author> <category term="Algorithm" /> <category term="Graph" /> <summary>스터디 때 밤새 붙잡았던 문제다. “1에서 N까지 가는데 v1, v2를 모두 거쳐야 한다”는 제약이 붙으니 구현이 헷갈렸다. 직접 자바로 정리해둔 기록. 문제 세팅 양방향 가중치 그래프, 정점은 1..N 반드시 v1, v2를 모두 통과해야 하며 순서는 자유 답은 min(1→v1→v2→N, 1→v2→v1→N) 핵심 코드 가중치가 큰 입력을 대비해 INF = 200000 * 1000L로 long을 사용했다. poll()한 값이 이미 더 큰 경우 스킵한다. PriorityQueue&amp;lt;int[]&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;((a,b) -&amp;gt; a[1]-b[1]); pq.offer(new int[]{start, 0}); while (!pq.isEmpty...</summary> </entry> </feed>
