<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Segment Tree on Kelly Dev</title><link>https://kelly-chui.github.io/tags/segment-tree/</link><description>Recent content in Segment Tree on Kelly Dev</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 13 Aug 2026 21:30:00 +0900</lastBuildDate><atom:link href="https://kelly-chui.github.io/tags/segment-tree/index.xml" rel="self" type="application/rss+xml"/><item><title>TIL. Aug 13, 2026</title><link>https://kelly-chui.github.io/til/2026/til-2026-08-13/</link><pubDate>Thu, 13 Aug 2026 21:30:00 +0900</pubDate><guid>https://kelly-chui.github.io/til/2026/til-2026-08-13/</guid><description>&lt;h2 id="오늘-한-내용"&gt;오늘 한 내용&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kelly-chui.github.io/posts/cs-data-structure-segment-tree/"&gt;Data Structure. Segment Tree&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kelly-chui.github.io/ps/2026/ps-leetcode-2213-longest-substring-of-one-repeating-character/"&gt;LeetCode 2213. Longest Substring of One Repeating Character&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kelly-chui.github.io/posts/stackday-dev-log-separating-responsibility-and-types/"&gt;StackDay. 책임 분리와 타입 분리&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="배운-내용"&gt;배운 내용&lt;/h2&gt;
&lt;h3 id="stackday-통계-계산"&gt;StackDay 통계 계산&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;HabitStatistics&lt;/code&gt;를 구현하면서 계산 결과를 표현하는 타입과 계산 로직을 분리했다. 다만 &lt;code&gt;HabitStatisticsCalculator&lt;/code&gt;가 &lt;code&gt;HabitStreakCalculator&lt;/code&gt;에 의존하게 되면서, 여러 Calculator가 같은 날짜 정규화와 완료 기록 필터링을 반복하는 문제가 보였다.&lt;/p&gt;
&lt;p&gt;타입을 나누는 것만으로 항상 구조가 좋아지는 것은 아니고, 공유하는 계산 맥락까지 함께 살펴봐야 한다는 점을 배웠다. 자세한 고민은 &lt;a href="https://kelly-chui.github.io/posts/stackday-dev-log-separating-responsibility-and-types/"&gt;StackDay 개발일지&lt;/a&gt;에 정리했다.&lt;/p&gt;</description></item><item><title>Leetcode 2213. Longest Substring of One Repeating Character</title><link>https://kelly-chui.github.io/ps/2026/ps-leetcode-2213-longest-substring-of-one-repeating-character/</link><pubDate>Thu, 13 Aug 2026 20:45:10 +0900</pubDate><guid>https://kelly-chui.github.io/ps/2026/ps-leetcode-2213-longest-substring-of-one-repeating-character/</guid><description>&lt;h2 id="문제"&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://leetcode.com/problems/longest-substring-of-one-repeating-character"&gt;https://leetcode.com/problems/longest-substring-of-one-repeating-character&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="풀이"&gt;풀이&lt;/h2&gt;
&lt;p&gt;스트링 &lt;code&gt;s&lt;/code&gt;에 대해 여러 번의 문자 변경 쿼리가 주어진다. 각 쿼리마다 특정 인덱스의 문자를 변경하고, 같은 문자가 연속되는 가장 긴 부분 스트링의 길이를 리턴하면 된다.&lt;/p&gt;
&lt;p&gt;스트링의 길이와 쿼리의 개수가 최대 $10^5$이므로, 문자를 변경할 때마다 스트링 전체를 탐색하는 방식으로는 해결할 수 없다.&lt;/p&gt;
&lt;p&gt;문자 하나를 변경하는 업데이트가 반복되고, 변경 이후 스트링 전체에서 가장 긴 연속 스트링의 길이를 구해야 한다. 따라서 변경된 구간만 갱신할 수 있는 &lt;a href="https://kelly-chui.github.io/posts/cs-data-structure-segment-tree/"&gt;Segment Tree&lt;/a&gt;를 사용했다.&lt;/p&gt;
&lt;p&gt;다만, 단순히 concat을 하면 안되고, 두 접합부의 경계를 확인한 다음 처리를 해줘야 한다.&lt;/p&gt;</description></item><item><title>Data Structure. Segment Tree</title><link>https://kelly-chui.github.io/posts/cs-data-structure-segment-tree/</link><pubDate>Thu, 13 Aug 2026 14:18:26 +0900</pubDate><guid>https://kelly-chui.github.io/posts/cs-data-structure-segment-tree/</guid><description>&lt;h2 id="segment-tree"&gt;Segment Tree&lt;/h2&gt;
&lt;p&gt;배열의 특정 구간에 대한 연산을 빠르게 처리하기 위한 이진 트리 형태의 자료구조.&lt;/p&gt;
&lt;p&gt;구간 합, 최솟값, 최댓값처럼 배열의 일정 범위를 대상으로 반복해서 연산해야 하는 경우에 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;일반적인 배열에서 특정 구간의 합을 구하려면 해당 구간의 원소를 직접 순회해야 하므로 $O(n)$의 시간이 필요하다. 세그먼트 트리는 배열의 여러 구간에 대한 연산 결과를 트리 형태로 저장하여 구간 조회를 $O(\log n)$에 처리할 수 있도록 한다.&lt;/p&gt;
&lt;p&gt;특히 배열의 값이 변경되는 상황에서도 구간에 대한 연산을 반복해서 수행해야 할 때 사용할 수 있다.&lt;/p&gt;</description></item></channel></rss>