리스트 심화 — 약 75분 구성:
리스트[start:end:step]
| 표현 | 의미 |
|---|---|
a[::2] | 처음부터 끝까지 2칸씩 건너뛰기 |
a[1::2] | 인덱스 1부터 2칸씩 |
a[::-1] | 전체 역순 (뒤집기) |
a[5:1:-1] | 인덱스 5→2 역순 |
a = [1, 2, 3, 4, 5]
a[1:3] = [20, 30] # 교체 → [1, 20, 30, 4, 5]
a[1:3] = [99] # 길이 달라도 OK → [1, 99, 4, 5]
a[1:3] = [] # 삭제 → [1, 5]
슬라이싱 결과는 새 리스트이므로, 바로 또 슬라이싱 가능
arr = [5, 10, 15, 20, 25, 30]
arr[::2][::-1] # [5, 15, 25] → [25, 15, 5]
# 회문 판별
s == s[::-1]
# 왼쪽 회전
arr[k:] + arr[:k]
# 올바른 방법
grid = [[0] * n for _ in range(m)]
# 잘못된 방법 (같은 리스트를 참조!)
grid = [[0] * n] * m # 하나 바꾸면 전부 바뀜
grid[행][열]
for i in range(len(grid)): # 행
for j in range(len(grid[0])): # 열
print(grid[i][j])
# 내가 처음 작성한 코드
max_grid = [0] * 3 # 문제점 1: 크기 하드코딩
# 문제점 2: 음수 값이 들어오면?
# 문제점 1: 열 개수가 달라지면 동작 안 함
max_grid = [0] * len(grid[0]) # 일반화!
# 문제점 2: 음수만 있는 경우 0이 최댓값이 되어버림
grid = [[-5, -3], [-1, -7]]
# [0]*2로 초기화하면 → [0, 0] (오답!)
# 기대 결과 → [-1, -3]
# 해결: 첫 번째 행의 값으로 초기화
max_grid = grid[0][:] # grid[0]을 복사
for i in range(1, len(grid)): # 1번 행부터 비교
for j in range(len(grid[0])):
if max_grid[j] < grid[i][j]:
max_grid[j] = grid[i][j]
COS Pro에서는 입력 조건을 반드시 확인하자. "양수만 들어온다"는 보장이 없으면 초기값에 주의!
grid = [[0] * n for _ in range(n)]
for i in range(n):
grid[i][i] = 1 # 대각선 = 행번호 == 열번호
| Python | Java | 설명 |
|---|---|---|
append(x) | add(x) | 끝에 추가 |
insert(i, x) | add(i, x) | 위치 삽입 |
pop() / pop(i) | remove(i) | 제거 후 반환 |
remove(x) | remove(Object) | 값으로 제거 |
sort() | sort() | 정렬 (원본 변경) |
reverse() | Collections.reverse() | 뒤집기 (원본 변경) |
index(x) | indexOf(x) | 위치 반환 |
count(x) | — | 개수 반환 |
| 원본 변경 (None 반환) | 새 리스트 반환 |
|---|---|
list.sort() | sorted(list) |
list.reverse() | list[::-1] |
# 주의! 이러면 None이 들어감
result = arr.sort() # result = None
# 올바른 방법
arr.sort()
result = arr
# 또는
result = sorted(arr)
# Python: 값이 없으면 ValueError 에러!
arr.index(99) # ValueError: 99 is not in list
# Java: indexOf()는 -1 반환
# 안전한 패턴
if target in arr:
return arr.index(target)
return -1