20260317 오늘의 학습: 리스트 심화

Yesol Lee·2026년 3월 17일

COS Python

목록 보기
3/30

어제(3/16) 학습 요약:

  • 수준 진단 테스트 완료 (8문제, 1차 정답률 62.5%)
  • Java vs Python 핵심 차이 정리
  • COS Pro 3가지 유형(빈칸/디버깅/함수작성) 맛보기

취약 포인트:

  • 리스트 슬라이싱 (음수 인덱스, 반환 형태)
  • Python 고유 키워드 (def 등)
  • 자료형 변환 (set↔list, sorted 활용)

오늘 수업 계획

리스트 심화 — 약 75분 구성:

  1. 워밍업 — 어제 슬라이싱 오답 빠르게 복습
  2. 슬라이싱 심화 — step 활용, 역순, 슬라이싱으로 수정/삭제 + 문제 3~4개
  3. 2차원 배열 — 생성, 접근, 순회 + 격자 관련 문제 2~3개
  4. 리스트 메서드 정리 — append, pop, sort 등 Java ArrayList와 비교 + 문제 1~2개
  5. 마무리 종합 문제 — 디버깅 + 빈칸 채우기 2문제

1. 슬라이싱 심화

step (세 번째 인자)

리스트[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]

2. 2차원 배열

생성

# 올바른 방법
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   # 대각선 = 행번호 == 열번호

3. 리스트 주요 메서드

Java ArrayList 비교

PythonJava설명
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)개수 반환

핵심: 원본 변경 vs 새 리스트

원본 변경 (None 반환)새 리스트 반환
list.sort()sorted(list)
list.reverse()list[::-1]
# 주의! 이러면 None이 들어감
result = arr.sort()   # result = None

# 올바른 방법
arr.sort()
result = arr
# 또는
result = sorted(arr)

index() 주의사항

# Python: 값이 없으면 ValueError 에러!
arr.index(99)   # ValueError: 99 is not in list

# Java: indexOf()는 -1 반환

# 안전한 패턴
if target in arr:
    return arr.index(target)
return -1

오늘의 결과

  • 총 11문제 풀이, 1차 정답률 100%
  • 어제 취약했던 슬라이싱 추가 학습
  • 다음 학습: 딕셔너리 활용 (빈도 카운팅, key-value 활용)
  • 클로드 지시문 수정 : 학습 정리글 작성 방법 추가 (양식, 폴더 구조 등)
profile
문서화를 좋아하는 개발자

0개의 댓글