collections.deque 기반 큐, 괄호 매칭/요세푸스/프린터 우선순위 등 6문제 풀이COS Pro 단골 유형인 구현/시뮬레이션 기초를 다룬다. 좌표 이동 패턴(dx/dy), 2차원 배열 90도 회전을 핵심 개념으로 잡고 빈칸 2문제 + 함수 작성 1문제를 푼다.
시뮬레이션 문제의 출발점. 상하좌우를 일일이 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가 왜 다른지 자연스럽게 연결된다.
좌표 이동 후 새 좌표가 격자 안에 있는지 확인하는 패턴.
if 0 <= nx < N and 0 <= ny < N:
x, y = nx, ny # 유효하면 이동
# 아니면 그대로 (명령 무시)
피드백 포인트: 경계 체크를 0 <= x < N처럼 이동 전 좌표로 쓰거나, y 차원을 빠뜨리는 실수가 잦다.
nx, ny)and로 연결)공식 버전:
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도 회전수학적 증명보다는 "왜 이게 그렇게 되는지 그림으로 한 번 그려보기"가 기억에 잘 남는다.
K % 4같은 회전을 K번 반복할 때, 4번 돌면 원상복귀하므로 K = K % 4로 불필요한 반복을 제거한다.
K = K % 4
for _ in range(K):
result = rotate_once(result)
이 패턴은 회전뿐 아니라 순환 구조 전반에 쓰인다. 요세푸스, 원형 큐, 방향 회전 등.
구현 문제에서 가장 헷갈리는 부분. 리스트 기반 2차원 배열은 수학 좌표계와 다르다.
| 구분 | 수학 좌표계 | 리스트 좌표계 (grid[x][y]) |
|---|---|---|
| x 증가 방향 | 오른쪽 | 아래 |
| y 증가 방향 | 위 | 오른쪽 |
| 북 | y+1 | x-1 |
| 남 | y-1 | x+1 |
| 동 | x+1 | y+1 |
| 서 | x-1 | y-1 |
왜 이렇게 쓰는가?
grid[x][y]라고 쓰면, grid[x]가 먼저 행을 선택하고, 그 다음 [y]가 열을 고른다. 즉 x는 행 번호(세로 위치), y는 열 번호(가로 위치)가 되는 것이 자연스럽다.
수업 중 질문: "행열 규약이 왜 저런지 아직 이해 못했어."
→ 수학식으로 이해하려 하지 말고, 리스트 구조가 원래 그렇게 생겼다고 받아들이는 것이 실전에 빠르다. 문제 풀 때 "북이면 x를 줄인다"만 기억하면 됨.
% 4L/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는 음수 나올 수 있어 주의.)
오늘의 중요 발견: 함수 작성 문제에서 (가로, 세로) 좌표계로 dx/dy를 짠 답과 예시 답이 달랐다. 학습자가 먼저 "예시 답이 정확한지 검증해달라"고 요청 → 확인해보니 학습자의 로직도 완벽했고, 단지 좌표 규약이 (가로,세로)냐 (행,열)이냐의 차이였다.
피드백 포인트: