구현/시뮬레이션
1. 구간별 이동 및 상태 변화 시뮬레이션 (방향 배열 사용)
2D 배열 내에서 상, 하, 좌, 우 이동:
int[] dx = {-1, 1, 0, 0}; // 상, 하, 좌, 우
int[] dy = {0, 0, -1, 1};
void simulate(int x, int y, int[][] grid) {
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < grid.length && ny >= 0 && ny < grid[0].length) {
// 상태 변화 로직
System.out.println("Next Position: (" + nx + ", " + ny + ")");
}
}
}
2. 회전 문제 (Matrix Rotation)
2D 배열(행렬) 90도 회전:
void rotateMatrix(int[][] matrix) {
int n = matrix.length;
for (int i = 0; i < n / 2; i++) {
for (int j = i; j < n - i - 1; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[n - j - 1][i];
matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
matrix[j][n - i - 1] = temp;
}
}
}
3. 시뮬레이션 문제: 달팽이 배열 (Snail Shell Array)
N x N 크기의 달팽이 배열 생성:
int[][] generateSnailArray(int n) {
int[][] snail = new int[n][n];
int[] dx = {0, 1, 0, -1}; // 우, 하, 좌, 상
int[] dy = {1, 0, -1, 0};
int x = 0, y = 0, direction = 0, value = 1;
while (value <= n * n) {
snail[x][y] = value++;
int nx = x + dx[direction];
int ny = y + dy[direction];
if (nx < 0 || nx >= n || ny < 0 || ny >= n || snail[nx][ny] != 0) {
direction = (direction + 1) % 4; // 방향 전환
nx = x + dx[direction];
ny = y + dy[direction];
}
x = nx;
y = ny;
}
return snail;
}
4. 마름모 시뮬레이션 (Diamond Shape Simulation)
마름모 모양으로 숫자 출력:
void printDiamond(int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i - 1; j++) System.out.print(" ");
for (int j = 0; j < 2 * i + 1; j++) System.out.print("*");
System.out.println();
}
for (int i = n - 2; i >= 0; i--) {
for (int j = 0; j < n - i - 1; j++) System.out.print(" ");
for (int j = 0; j < 2 * i + 1; j++) System.out.print("*");
System.out.println();
}
}
5. 시뮬레이션: 주사위 굴리기 (Dice Rolling Simulation)
주사위 굴리기 구현:
void rollDice(int[] dice, String direction) {
int[] temp = dice.clone();
if (direction.equals("E")) { // 동쪽으로 굴리기
dice[1] = temp[3];
dice[3] = temp[6];
dice[6] = temp[4];
dice[4] = temp[1];
} else if (direction.equals("W")) { // 서쪽으로 굴리기
dice[1] = temp[4];
dice[4] = temp[6];
dice[6] = temp[3];
dice[3] = temp[1];
} else if (direction.equals("N")) { // 북쪽으로 굴리기
dice[1] = temp[5];
dice[5] = temp[6];
dice[6] = temp[2];
dice[2] = temp[1];
} else if (direction.equals("S")) { // 남쪽으로 굴리기
dice[1] = temp[2];
dice[2] = temp[6];
dice[6] = temp[5];
dice[5] = temp[1];
}
}
6. 구간 합 문제 (Prefix Sum)
1차원 배열 구간 합 구하기:
int[] computePrefixSum(int[] arr) {
int[] prefixSum = new int[arr.length];
prefixSum[0] = arr[0];
for (int i = 1; i < arr.length; i++) {
prefixSum[i] = prefixSum[i - 1] + arr[i];
}
return prefixSum;
}
// 구간 [l, r]의 합 구하기
int rangeSum(int[] prefixSum, int l, int r) {
if (l == 0) return prefixSum[r];
return prefixSum[r] - prefixSum[l - 1];
}
7. 토글 문제 (토글 시뮬레이션)
2D 배열에서 행과 열을 토글 (1을 0으로, 0을 1로 변환):
void toggleMatrix(int[][] matrix, int row, int col) {
for (int i = 0; i < matrix.length; i++) {
matrix[row][i] = 1 - matrix[row][i]; // 행 토글
}
for (int i = 0; i < matrix[0].length; i++) {
matrix[i][col] = 1 - matrix[i][col]; // 열 토글
}
}
8. 체스판 시뮬레이션 (Chess Board Simulation)
체스판의 나이트가 이동할 수 있는 위치:
int[] dx = {-2, -1, 1, 2, 2, 1, -1, -2}; // 나이트 이동 방향
int[] dy = {1, 2, 2, 1, -1, -2, -2, -1};
void knightMoves(int x, int y, int n) {
for (int i = 0; i < 8; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && ny >= 0 && nx < n && ny < n) {
System.out.println("Knight can move to: (" + nx + ", " + ny + ")");
}
}
}
9. 좌표 회전 시뮬레이션 (Coordinate Rotation Simulation)
좌표 회전 (90도 회전):
int[] rotatePoint(int x, int y, int centerX, int centerY) {
int newX = centerX + (y - centerY);
int newY = centerY - (x - centerX);
return new int[]{newX, newY};
}
Last updated