구현/시뮬레이션

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