1. basket[start-1:end:-1] (잘못된 결과 가능성 높음)

이 방식은 처음부터 뒤로 걸어가며 요소를 찾는 방식입니다.

  • 동작: start-1 인덱스에서 시작해서 왼쪽(역방향)으로 end 직전까지 하나씩 건너뛰며 요소를 가져옵니다.

  • 문제점: 보통 start-1보다 end가 더 큰 숫자일 텐데, 뒤로 가면서(-1) 더 큰 숫자인 end에 도달할 수 없으므로 **빈 리스트 []**가 나올 확률이 높습니다.

  • 사용법: 이 방식으로 뒤집으려면 basket[end-1:start-2:-1]처럼 시작점과 끝점을 바꿔서 적어야 합니다.

2. basket[1:4][::-1] (정상적인 뒤집기)

이 방식은 두 단계로 작동하며, 우리가 의도한 “구간 뒤집기”에 적합합니다.

  • 1단계 basket[1:4]: 먼저 원본에서 1, 2, 3번 인덱스 요소만 똑 떼어내서 새로운 리스트를 만듭니다.

  • 2단계 [::-1]: 만들어진 새 리스트를 통째로 뒤집습니다.

  • 장점: 인덱스 계산이 직관적이라 실수가 적습니다.

리스트의 인덱스 범위를 벗어나는(IndexError) 상황을 안전하게 처리하고 싶으시군요! 파이썬에서는 크게 두 가지 세련된 방법으로 이 문제를 해결할 수 있습니다.


리스트 길이 다를 때 transpose

1. try-except 블록 (가장 확실한 방법)

파이썬의 철학 중 하나인 “허락보다 용서를 구하는 것이 쉽다(EAFP)“는 원칙에 가장 부합하는 방식입니다. 에러가 발생할 것 같은 코드를 try에 넣고, 에러 발생 시 except로 빠지게 합니다.

Python

try:
    item = lst[idx]
    # 인덱스가 정상일 때 처리할 로직
    print(f"찾은 값: {item}")
except IndexError:
    # 인덱스 범위를 벗어났을 때 실행될 분기
    print("인덱스 범위를 벗어났습니다. 기본값을 사용하거나 무시합니다.")
    item = None  # 혹은 다른 대체 동작

2. 조건문으로 미리 체크 (LBYL 방식)

“뛰기 전에 살펴라(LBYL)“는 원칙으로, 인덱스 값을 리스트의 길이(len(lst))와 비교하여 안전할 때만 접근하는 방식입니다.

Python

if 0 <= idx < len(lst):
    item = lst[idx]
    print(f"찾은 값: {item}")
else:
    # 범위를 벗어난 경우의 분기
    print("잘못된 인덱스 접근입니다.")

3. 더 똑똑한 방법: Slicing 활용

리스트 슬라이싱([:])은 인덱스 범위를 벗어나도 에러를 내지 않고 빈 리스트를 반환하는 특징이 있습니다. 이를 이용해 에러 없이 값을 가져올 수 있습니다.

Python

# idx가 10인데 lst 길이는 5라면?
item = lst[idx:idx+1] 

if item:
    value = item[0]
else:
    # 비어있다면 범위를 벗어난 것
    value = "기본값"

어떤 상황에 무엇을 쓸까요?

방식추천 상황
try-except예외 상황이 가끔 발생하며, 코드를 간결하게 유지하고 싶을 때
if문 체크인덱스 초과가 빈번하게 예상되거나, 로직 흐름상 미리 체크하는 게 자연스러울 때
슬라이싱에러 처리 로직을 길게 쓰기 귀찮고, 그냥 빈 결과만 받아도 될 때

💡 팁: 딕셔너리라면 get()을 쓰세요!

만약 리스트가 아니라 키-값 쌍인 딕셔너리를 쓰고 계신다면, dict.get(key, default)를 통해 에러 없이 안전하게 분기 처리를 할 수 있습니다.

지금 작성 중인 코드에서 어떤 데이터를 인덱스로 접근하려고 하시나요? 구체적인 상황(예: “입력받은 2차원 리스트에서 특정 좌표 값을 가져오고 싶다” 등)을 알려주시면 그에 딱 맞는 코드를 짜 드릴게요!

파이썬에서 어레이를 ‘윈도우(창문)’ 밀듯이 훑는 슬라이딩 윈도우(Sliding Window) 기법은 효율성()이 핵심입니다. 라이브러리 없이 바로 복사해서 쓸 수 있는 두 가지 핵심 템플릿을 정리해 드릴게요.


1. 고정 크기 윈도우 (Fixed Window)

윈도우의 크기가 k로 정해져 있을 때 사용합니다. 매번 슬라이싱해서 새로 계산하는 게 아니라, ‘나가는 놈 빼고 들어오는 놈 넣는’ 것이 포인트입니다.

Python

def fixed_window(arr, k):
    n = len(arr)
    if n < k: return 0
    
    # 1. 첫 번째 윈도우 초기화
    window_val = sum(arr[:k]) # 곱셈이라면 여기서 초기 곱을 구함
    result = window_val
    
    # 2. 한 칸씩 밀면서 훑기
    for i in range(k, n):
        # window_val = window_val - (나가는 왼쪽 요소) + (들어오는 오른쪽 요소)
        window_val += arr[i] - arr[i - k]
        result = max(result, window_val) # 필요에 따라 최댓값 등 갱신
        
    return result

2. 가변 크기 윈도우 (Two Pointers / Variable Window)

조건에 따라 창문의 크기를 늘렸다 줄였다 해야 할 때 사용합니다. 보통 left, right 두 포인터를 씁니다.

Python

def variable_window(arr, target):
    left = 0
    current_val = 0
    result = 0
    
    for right in range(len(arr)):
        # 1. 오른쪽 포인터 확장 (요소 추가)
        current_val += arr[right]
        
        # 2. 특정 조건을 만족할 때까지 왼쪽 포인터 축소
        while current_val > target: # 예: 합이 타겟을 넘으면 줄임
            current_val -= arr[left]
            left += 1
            
        # 3. 윈도우 상태 확인 및 정답 갱신
        result = max(result, right - left + 1)
        
    return result

윈도우 아이디어: 델타탐색처럼 하고 루프 돌리면 안되나? 계쏙 한 칸씩 옆으로 가게