시뮬레이션이란?
시뮬레이션(simulation) 은 문제가 묘사하는 과정을 그대로 코드로 옮겨 따라
하는 풀이법입니다. 똑똑한 수식이나 알고리즘 대신, "시키는 대로 정확히 흉내 내기"가
핵심입니다.
1. 시뮬레이션의 마음가짐
별다른 통찰이 없어도 됩니다. 대신 문제의 규칙을 빠짐없이, 순서대로 코드로
재현해야 합니다. 그래서 "독해력 + 꼼꼼함"이 실력입니다.
예: "로봇이 명령 문자열을 따라 격자 위를 움직인다. 마지막 위치를 출력하라."
명령: 'U'=위, 'D'=아래, 'L'=왼, 'R'=오른쪽
시작 (0,0)에서 명령을 하나씩 따라간다.
2. 상태를 변수로 들고 갱신
시뮬레이션은 "현재 상태"를 변수에 들고, 각 단계마다 갱신하는 구조입니다.
int x = 0, y = 0; // 현재 위치(상태)
string cmd; cin >> cmd;
for (char c : cmd) {
if (c == 'U') y++;
else if (c == 'D') y--;
else if (c == 'L') x--;
else if (c == 'R') x++;
}
cout << x << ' ' << y << '\n';
상태(여기선 위치 x,y)를 정확히 정의하고, 각 입력에 따라 어떻게 바뀌는지만
적으면 됩니다.
3. 방향 배열로 깔끔하게
상하좌우 같은 이동은 방향 배열로 표현하면 조건문이 줄어듭니다.
// 예: 0=북, 시계방향. 회전은 dir = (dir+1)%4
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
회전·이동이 섞인 문제(달팽이 채우기 등)에서 특히 유용합니다.
4. 어떻게 알아보나
다음 특징이 보이면 시뮬레이션 문제입니다.
- "다음 규칙에 따라 ~를 반복한다", "이 과정을 따라가라".
- 명령/턴/단계가 순서대로 주어진다.
- 영리한 공식보다 과정 재현이 자연스럽다.
복잡도
단계 수 \(\times\) 한 단계 비용입니다. 보통 그대로 따라 해도 충분하지만, 단계가
아주 많으면(예: \(10^9\)번 반복) 주기를 찾아 건너뛰는 최적화가 필요할 수 있습니다.
정리
- 시뮬레이션 = 문제의 과정을 그대로 흉내 내기.
- "현재 상태"를 변수로 들고 단계마다 갱신.
- 이동/회전은 방향 배열로 깔끔하게.
- 똑똑함보다 정확한 독해와 꼼꼼함이 핵심.