20260415 오늘의 학습: 구현/시뮬레이션 기초

Yesol Lee·2026년 4월 15일

COS Python

목록 보기
19/30

지난 학습 요약

  • 스택과 큐 개념 학습: 리스트 기반 스택, collections.deque 기반 큐, 괄호 매칭/요세푸스/프린터 우선순위 등 6문제 풀이
  • 스택 활용 시 "무엇을 저장할지" 판단하는 부분에서 약간의 혼동이 있었으나 힌트 후 해결
  • 이어서 미학습 유형인 구현/시뮬레이션으로 넘어감

오늘 수업 계획

COS Pro 단골 유형인 구현/시뮬레이션 기초를 다룬다. 좌표 이동 패턴(dx/dy), 2차원 배열 90도 회전을 핵심 개념으로 잡고 빈칸 2문제 + 함수 작성 1문제를 푼다.


학습 내용 정리

1. 좌표 이동 dx/dy 패턴

시뮬레이션 문제의 출발점. 상하좌우를 일일이 if-else로 쓰지 않고, 방향 배열 두 개로 한 번에 처리한다.

# 북, 동, 남, 서 (시계방향)
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

for i in range(4):
    nx = x + dx[i]
    ny = y + dy[i]

핵심: dx, dy의 배열 순서는 방향 순서(N/E/S/W 또는 U/R/D/L)에 따라 달라진다. 문제마다 방향 규약을 먼저 확인해야 한다.

수업 중 질문: "dx dy에 방향값 넣어두는건 방향 순서에 따라 달라지겠네?"
→ 정확한 일반화. 이전에 푼 소용돌이 문제에서 방향이 우→하→좌→상 순서로 돌았던 것을 떠올리면, 그 문제의 dx/dy와 이번 문제의 dx/dy가 왜 다른지 자연스럽게 연결된다.

2. 경계 체크 (Out-of-bound 방어)

좌표 이동 후 새 좌표가 격자 안에 있는지 확인하는 패턴.

if 0 <= nx < N and 0 <= ny < N:
    x, y = nx, ny   # 유효하면 이동
# 아니면 그대로 (명령 무시)

피드백 포인트: 경계 체크를 0 <= x < N처럼 이동 전 좌표로 쓰거나, y 차원을 빠뜨리는 실수가 잦다.

  • 체크 대상은 반드시 이동 후 좌표(nx, ny)
  • 2차원이면 x, y 둘 다 검사해야 함 (and로 연결)

3. 2차원 배열 90도 시계 회전

공식 버전:

def rotate_once(arr):
    N = len(arr)
    rotated = [[0]*N for _ in range(N)]
    for i in range(N):
        for j in range(N):
            rotated[j][N-1-i] = arr[i][j]
    return rotated

Pythonic 버전:

rotated = [list(row) for row in zip(*arr[::-1])]

수업 중 질문: "zip 사용한 부분이 왜 90도 회전이랑 같아지는지 모르겠다."
시각적 분해로 이해하면 쉽다.
1. arr[::-1] — 위아래 뒤집기 (행 순서 역전)
2. zip(*...) — 전치(transpose), 즉 행↔열 교환
3. 뒤집기 + 전치 = 시계방향 90도 회전

수학적 증명보다는 "왜 이게 그렇게 되는지 그림으로 한 번 그려보기"가 기억에 잘 남는다.

4. 주기성 활용 — K % 4

같은 회전을 K번 반복할 때, 4번 돌면 원상복귀하므로 K = K % 4로 불필요한 반복을 제거한다.

K = K % 4
for _ in range(K):
    result = rotate_once(result)

이 패턴은 회전뿐 아니라 순환 구조 전반에 쓰인다. 요세푸스, 원형 큐, 방향 회전 등.

5. (행, 열) 좌표 규약

구현 문제에서 가장 헷갈리는 부분. 리스트 기반 2차원 배열은 수학 좌표계와 다르다.

구분수학 좌표계리스트 좌표계 (grid[x][y])
x 증가 방향오른쪽아래
y 증가 방향오른쪽
y+1x-1
y-1x+1
x+1y+1
x-1y-1

왜 이렇게 쓰는가?
grid[x][y]라고 쓰면, grid[x]가 먼저 행을 선택하고, 그 다음 [y]가 열을 고른다. 즉 x는 행 번호(세로 위치), y는 열 번호(가로 위치)가 되는 것이 자연스럽다.

수업 중 질문: "행열 규약이 왜 저런지 아직 이해 못했어."
→ 수학식으로 이해하려 하지 말고, 리스트 구조가 원래 그렇게 생겼다고 받아들이는 것이 실전에 빠르다. 문제 풀 때 "북이면 x를 줄인다"만 기억하면 됨.

6. 방향 전환 로직 — % 4

L/R 명령으로 방향을 바꿀 때:

# 방향: 0(북) 1(동) 2(남) 3(서)
if cmd == 'R':
    d = (d + 1) % 4
elif cmd == 'L':
    d = (d - 1) % 4   # Python은 음수 % 양수도 자동 양수화

Python의 %는 음수에서도 양수 결과를 반환하므로 (d-1) % 4가 안전하게 작동한다. (Java/C는 음수 나올 수 있어 주의.)

7. 문제에서 예시 답을 의심하는 능력

오늘의 중요 발견: 함수 작성 문제에서 (가로, 세로) 좌표계로 dx/dy를 짠 답과 예시 답이 달랐다. 학습자가 먼저 "예시 답이 정확한지 검증해달라"고 요청 → 확인해보니 학습자의 로직도 완벽했고, 단지 좌표 규약이 (가로,세로)냐 (행,열)이냐의 차이였다.

피드백 포인트:

  • 자기 답이 틀렸다고 바로 단정하지 말 것
  • 예시 답과 다르면 규약 차이인지 로직 오류인지부터 구분해야 함
  • COS Pro 실전에서는 문제에 명시된 좌표 규약을 먼저 확인하고 시작하는 습관이 중요

오늘의 결과

  • 풀이 3문제 (빈칸 2, 함수 작성 1) / 1차 정답률 100% (경계 체크 부분만 힌트 후 수정)
  • 좌표 이동 dx/dy + 90도 회전 + K%4 주기성 — 구현 3대 기초 패턴 습득
  • 다음 학습(4/16)은 구현/시뮬레이션 기초 마무리 (달팽이 배열, 종이접기 등 복합 시뮬레이션 예정)
profile
문서화를 좋아하는 개발자

0개의 댓글