Backend
home
✏️

Day3 (3/7) - 중복 문자가 없는 가장 긴 부분 문자열의 길이

생성 일시
2026/03/07 08:51
알고리즘/자료구조 유형
Set
Sliding Window

문제

문자열에서 중복 문자가 없는 가장 긴 부분 문자열의 길이를 구하기

내가 작성한 답안

package algorithm; /** * 문제: 문자열에서 중복 문자가 없는 가장 긴 부분 문자열의 길이를 구하기 * 목표 시간복잡도: O(n) * * Sliding Window * 1. 윈도우(부분 구간)을 유지하면서 왼쪽 / 오른쪽 포인터를 이동 * 2. 흐름 * - right 포인터 이동 * - 중복 없으면 확장 * - 중복 발생하면 left 이동 * - 최대 길이 갱신 * * 3. Set을 활용하는 이유는 중복을 제거하기 위함 * - Set은 중복 허용을 하지 않음 */ import java.util.*; public class SlidingWindowEx { public static void main(String[] args) { String s = "abcabcbb"; System.out.println(lengthOfLongestSubstring(s)); } /** * right와 left 변수를 어떻게 활용하는지를 파악하는 게 중요 * left: 축소 * right: 확장 * => window를 늘리다가 문제가 생기면 줄인다! * * 초기화를 해서 진행할 수도 있지만 그렇게 되면 자원 낭비이기에 * left를 이동해서 중복을 제거하는 방향으로 진행한다. * 하지만 한 번만 이동해가지고는 안 될수도 있기 때문에 * while을 활용하여 중복이 사라질 때까지 처리해주는 로직을 구성한다. * * === 패턴 === * 1. right 확장 * 2. 문제 발생 * 3. left 이동으로 해결 */ private static int lengthOfLongestSubstring(String s) { Set<Character> set = new HashSet<>(); int left = 0; int maxLength = 0; // 최대 길이 변수 for (int right = 0; right < s.length(); right++) { // set에 포함이 되어있다면 제거해주고, left를 증가시킨다 while (set.contains(s.charAt(right))) { set.remove(s.charAt(left)); left++; } // set에 먼저 추가를 해주는 로직을 고려하는 게 맞음 set.add(s.charAt(right)); // 현재 윈도우 길이 계산과 기존 최대 길이 비교 maxLength = Math.max(maxLength, right - left + 1); } return maxLength; } }
Java
복사

오늘의 진행내용 정리

[Day 3] 문제 문자열에서 중복 문자가 없는 가장 긴 부분 문자열의 길이를 구하기 사용 알고리즘 Sliding Window 사용한 자료구조 Set, HashSet 시간복잡도 O(n) 배운 점 1. 중복 발생 시 left 이동 2. for문에서 right 변수 활용, while문에서 set을 구성 3. set.contains(left)로 중복될 경우 left 이동
C
복사