Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions longest-substring-without-repeating-characters/socow.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
"""
📚 3. Longest Substring Without Repeating Characters

📌 문제 요약
- 주어진 문자열 s에서 중복 문자가 없는 가장 긴 부분 문자열의 길이 찾기
- 예: "abcabcbb" → "abc" → 3

🎯 핵심 알고리즘
- 패턴: 슬라이딩 윈도우 (Sliding Window) + 해시맵
- 시간복잡도: O(n)
- 공간복잡도: O(min(n, m)) - m은 문자 집합 크기

💡 핵심 아이디어
1. left, right 두 포인터로 윈도우 관리
2. 해시맵에 각 문자의 마지막 위치 저장
3. 중복 발견 시 → left를 중복 문자 다음으로 점프!
4. 매 단계마다 윈도우 크기(right - left + 1) 최댓값 갱신
"""


class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
char_index = {} # 문자 → 마지막 인덱스
left = 0
max_len = 0

for right, char in enumerate(s):
# 중복 문자가 현재 윈도우 안에 있으면
if char in char_index and char_index[char] >= left:
left = char_index[char] + 1 # 중복 다음으로 점프

char_index[char] = right # 현재 위치 갱신
max_len = max(max_len, right - left + 1)

return max_len


# Set을 사용한 방식 (더 직관적)
class SolutionWithSet:
def lengthOfLongestSubstring(self, s: str) -> int:
char_set = set()
left = 0
max_len = 0

for right in range(len(s)):
# 중복이 사라질 때까지 left 이동
while s[right] in char_set:
char_set.remove(s[left])
left += 1

char_set.add(s[right])
max_len = max(max_len, right - left + 1)

return max_len

41 changes: 41 additions & 0 deletions reverse-linked-list/socow.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
"""
📚 206. Reverse Linked List

📌 문제 요약
- 단방향 연결 리스트가 주어졌을 때, 리스트를 뒤집어서 반환하기
- 예: 1→2→3→4→5 → 5→4→3→2→1

🎯 핵심 알고리즘
- 패턴: 반복 (Iterative)
- 시간복잡도: O(n)
- 공간복잡도: O(1) (반복)

💡 핵심 아이디어
1. prev = None, curr = head로 시작
2. 각 노드에서 next를 저장 → curr.next를 prev로 변경
3. prev = curr, curr = next로 이동
4. curr이 None이 되면 prev가 새로운 head!
"""

from typing import Optional


class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next


# 반복 방식 (Iterative)
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
prev = None
curr = head

while curr:
next_node = curr.next # 다음 노드 저장
curr.next = prev # 방향 뒤집기
prev = curr # prev 이동
curr = next_node # curr 이동

return prev