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