1. 격자판 좌표가 (y, x)인 이유: 2차원 배열의 구조
일반적인 수학 좌표계에서는 가로축이 X, 세로축이 Y이므로 (x, y)로 표기하는 것이 익숙합니다. 하지만 코딩테스트의 격자판 문제는 컴퓨터 메모리의 2차원 배열을 기반으로 작동합니다.
- 2차원 배열 구조:
Array[Row][Column]->[행][열] - 매핑 방식: 행(Row)은 위아래(가로줄)를 결정하므로 Y축이 되고, 열(Column)은 좌우(세로줄)를 결정하므로 X축이 됩니다.
따라서 코딩테스트 시뮬레이션 문제를 풀 때는 항상 (y, x) 즉 [행][열] 구조를 표준으로 삼고 접근해야 메모리 접근 효율(Cache Locality)을 높이고 버그를 줄일 수 있습니다.
2. 윗칸으로 이동하는데 y - 1인 이유: Screen Coordinate
수학 그래프에서는 위로 올라갈수록 Y값이 증가하지만, 컴퓨터 그래픽스와 2차원 배열에서는 좌측 상단(Top-Left)이 기준점 (0, 0)이 됩니다.
- 오른쪽으로 이동: X축 증가 (
x + 1) - 아래쪽으로 이동: Y축 증가 (
y + 1) - 위쪽으로 이동: Y축 감소 (
y - 1)
텍스트를 위에서 아래로 읽어 내려가는 인간의 시선 및 메모리 주소 할당 방향과 일치하기 때문입니다. 기준점 (y, x)를 중심으로 상하좌우를 표현하면 아래 구조와 같습니다.
| (y - 1, x) [상] | ||
|---|---|---|
| (y, x - 1) [좌] | (y, x) [기준점] | (y, x + 1) [우] |
| (y + 1, x) [하] |
3. 방향 벡터 dy, dx에서 d의 의미
시뮬레이션 문제 해설을 보면 항상 int dy[4], int dx[4] 같은 배열이 등장합니다. 여기서 d는 변화량, 차이를 뜻하는 델타(Delta) 또는 변위(Displacement)의 약자입니다.
"현재 위치에서 다음 위치로 이동할 때 좌표가 얼마나 변화해야 하는가?"를 의미하는 상대적인 값(방향 벡터)을 상수로 묶어둔 것입니다.
C++ 4방향 탐색 표준 템플릿 코드
#include <iostream>
// 상, 하, 좌, 우 순서로 변위(Delta) 정의
const int dy[4] = { -1, 1, 0, 0 };
const int dx[4] = { 0, 0, -1, 1 };
int main() {
int currentY = 5, currentX = 5; // 현재 위치
for (int i = 0; i < 4; ++i) {
int nextY = currentY + dy[i];
int nextX = currentX + dx[i];
// 이 한 줄의 반복문으로 상하좌우 4방향 이동을 모두 처리할 수 있습니다.
std::cout << "방향 [" << i << "] 이동 결과: (" << nextY << ", " << nextX << ")\\n";
}
return 0;
}
이점: 수많은 if-else 분기문을 제거하여 코드 가독성을 높이고, CPU의 분기 예측 성공률을 높여 연산 오버헤드를 최적화할 수 있습니다.
4. 오프셋(Offset)이란 무엇인가?
오프셋(Offset)은 "기준점(Origin)으로부터 얼마나 떨어져 있는가?"를 나타내는 상대적인 거리나 변위를 뜻합니다. 절대적인 위치 좌표가 아니라, '상대적인 차이값'이라는 점이 핵심입니다.
1) 메모리 관점에서의 오프셋
배열 A[2]에 접근할 때, 시스템 내부적으로는 배열의 시작 주소(Base Address)에 [자료형 크기 * 인덱스]만큼의 오프셋을 더해 물리적 주소를 찾아갑니다. 이 연산이 단 한 번에 끝나기 때문에 배열의 임의 접근(Random Access) 시간 복잡도는 O(1)이 됩니다.
2) 게임 엔진 및 시뮬레이션 관점에서의 오프셋
몬스터가 플레이어를 추적하거나 캐릭터 전방에 타격 판정을 생성할 때, 캐릭터의 현재 좌표를 기준점(Base)으로 잡고, 바라보는 방향 벡터에 거리를 곱한 오프셋(Offset)을 더해 최종 목적지 좌표를 계산합니다.
최종 목적지 위치 = 기준 위치 + 오프셋
5. 요약 및 한계 인식 (Technical Insight)
- [y][x] 구조와 좌상단 (0, 0) 기준의 축 방향은 메모리 구조 및 화면 렌더링 방식에 기인한 프로그래밍의 표준 규칙입니다.
dy,dx는 복잡한 분기문 없이 주변을 탐색하기 위한 변위 오프셋 상수입니다.- 한계 인식: 2D 격자 시뮬레이션의 (y, x) 좌표계를 실제 3D 게임 엔진(예: Unreal Engine 5)의 월드 좌표계(X 전방, Y 우측 오른손 법칙)로 이식할 때는, 축 매핑 과정에서 축이 뒤바뀌거나 부동소수점 오차로 인한 정밀도 손실이 발생할 수 있으므로 명확한 축 변환 연산과 예외 처리가 필요합니다.
#코딩테스트 #C++ #시뮬레이션 #방향벡터 #오프셋 #게임개발자 #기본기다지기
'코딩테스트 준비' 카테고리의 다른 글
| C++ STL stack / queue 완전 정리 — LIFO vs FIFO 실전편 (0) | 2026.06.09 |
|---|---|
| C++ STL unordered_map 완전 정리 — 코딩테스트 실전편 (0) | 2026.06.09 |
| [C++] 코딩테스트 핵심 문법 정리: 파싱부터 수학 함수까지 (0) | 2026.05.11 |
| [C++] 배열과 리스트 그리고 벡터 (0) | 2026.01.26 |
| [C++ 코딩테스트] 시간복잡도 (0) | 2025.12.06 |