zero-wiki Help

시뮬레이션

시뮬레이션 문제 풀이 노하우

시뮬레이션이란 문제에 주어진 상황을 완벽하게 이해하고 이를 코드로 구현하는 과정을 말합니다.

시뮬레이션 문제를 푸는 방법

이는 다른 알고리즘처럼 일반화한 방법으로 설명하거나 풀 수 없습니다. 주어진 상황에 따라 해결 방식이 결정되기 떄문입니다.

다음 사항을 염두에 두세요.

  • 하나의 문제를 최대한 여러 개로 분리합니다.

    • 문제를 분리하지 않은 상태에서 풀이를 하려다 보면 함수에 문제에서 제시한 모든 동작을 구현하게 되므로 코드가 복잡해집니다.

  • 예외 처리가 필요하다면 독립 함수로 구현합니다.

    • 시뮬레이션 특성상 문제에서 구현할 부분이 많습니다. 이 코드가 기본으로 동작하는 코드와, 예외 처리 부분과 코드가 섞이면 구현과 디버깅이 어려워집니다.

행렬 연산

이는 시뮬레이션 문제에서 가장 많이 활용되는 기법입니다.

행렬 덧셈과 뺄셈, 그리고 곱셈

행렬 곱셈은 곱셈 순서가 중요하며 A -> B 순서로 곱했다면 행렬 A의 행과 행렬 B의 열 크기가 일치해야하고 곱셈의 결과는 행렬 A의 열, 행렬 B의 행의 크기가 됩니다.

전치 행렬

전치 행렬은 arr[i][j]arr[j][i]로 바꾸는 연산을 말합니다.

좌표 연산

시뮬레이션 문제에서는 조건에 따라 이동을 구현해야하는 경우가 많습니다. 이때 2차원 자표를 사용하면 유용하고 이를 배열로 나타냅니다.

좌표 배열로 나타내기

좌표를 배열로 표현하는 방법은 좌푯값에 해당하는 배열의 위치를 활용하는 겁니다. 좌표에서 (3, 4)에 해당하는 값을 배열 arr[4][3] = 1과 같이 저장할 수 있습니다.

좌표 이동 오프셋값으로 쉽게 표현하기

좌표를 활용하는 문제들은 현재 위치를 이동하는 문제들이 많습니다. 이럴때는 좌표의 이동을 if의 연속으로 표현하는 것보다 오프셋 값을 이용해 표현하면 코드를 훨씬 깔끔하게 구현할 수 있습니다.

for (let index = 1; index < 9; index++){ arr[curr_y + dy[i][curr_x + dx[i]] // ... }

대칭, 회전 연산

좌우 대칭 일반화

길이가 N인 정사각형 배열에서 좌우대칭을 하면 다음과 같이 표현할 수 있습니다.

arr[i][j] = arr[i][N-1-j]

회전 일반화

길이가 N인 정사각형 배열에서 90도 반시계 방향으로 회전하는 것은 다음과 같이 표현할 수 있습니다.

arr[i, j] = arr[N-1-j][i]
Last modified: 15 August 2024