본문 바로가기
TIL

[코테연습] 1861. Rotating the Box

by 크라00 2024. 11. 23.

문제 타입

  • 시뮬레이션 문제:
    • 2차원 배열을 특정 규칙에 따라 변환.
    • 돌(‘#’), 장애물(‘*’), 빈 공간(‘.’)의 상호작용을 처리.
    • 배열을 90도 회전하여 새로운 형태로 출력.

문제 분석

  • 주어진 작업:
    1. 각 행의 돌(‘#’)을 오른쪽으로 가능한 한 이동.
      • 장애물(‘*’)이나 다른 돌을 만나면 더 이상 이동 불가.
      • 이동 후에는 빈 공간(‘.’)으로 채워야 함.
    2. 박스를 오른쪽으로 90도 회전하여 새로운 배열 생성.
  • 입력 및 출력:
    • 입력: 2차원 배열 box (행 n, 열 m).
    • 출력: 오른쪽으로 90도 회전된 새로운 배열.
  • 예외 케이스:
    • 장애물(‘*’)로 인해 돌이 이동하지 못하는 경우.
    • 돌이나 빈 공간이 없는 행이나 열이 존재할 경우.

문제 풀이

1. 돌 이동 처리

  • 목표: 각 행에서 돌(‘#’)을 오른쪽으로 이동.
  • 방법:
    • 열의 끝에서부터 역방향으로 탐색.
    • 현재 위치에 돌(‘#’)이 있는 경우:
      • 돌이 이동 가능한 가장 오른쪽의 빈 공간(‘.’)을 탐색.
      • 빈 공간을 발견하면 돌을 이동하고, 기존 위치는 빈 공간으로 변경.
    • 장애물(‘*’)을 만나면 탐색 중단.

2. 박스 90도 회전

  • 목표: 처리된 박스를 오른쪽으로 90도 회전.
  • 방법:
    • 새로운 배열을 생성 (m x n 크기).
    • 열 → 행으로 매핑:
      • degreed[i][n - j - 1] = box[j][i]
    • 슬라이싱과 반복문을 활용해 각 위치의 데이터를 회전 후 저장.

3. 반환

  • 처리 완료된 degreed 배열 반환.

 

> java

 

class Solution {
    public char[][] rotateTheBox(char[][] box) {
        int n = box.length; // 박스의 행 개수
        int m = box[0].length; // 박스의 열 개수

        // 회전된 박스를 저장할 새로운 배열
        char[][] degreed = new char[m][n];

        // 각 행에서 돌(‘#’)을 오른쪽으로 이동시키는 작업
        for (int i = 0; i < n; i++) {
            for(int j = m - 1; j >= 0; j--) { // 열의 끝에서부터 시작
                char now = box[i][j]; // 현재 위치의 문자 확인
                if (now == '#') { // 돌(‘#’)인 경우
                    int idx = j + 1; // 돌이 이동할 위치를 찾기 위해 초기화
                    while(idx < m) { // 범위를 벗어나지 않는 동안
                        if (box[i][idx] == '.') { // 빈 공간(‘.’)이라면
                            idx++; // 오른쪽으로 이동
                        } else {
                            break; // 돌이나 장애물(‘*’)을 만나면 중단
                        }
                    }
                    if (idx != j + 1) { // 돌이 이동 가능한 경우
                        box[i][idx - 1] = '#'; // 새로운 위치로 돌을 이동
                        box[i][j] = '.'; // 원래 위치는 빈 공간으로 변경
                    }
                }
            }
        }

        // 박스를 90도 회전시키는 작업
        for (int i = 0; i < m; i++) { // 새로운 배열의 열 인덱스
            int k = n - 1; // 원래 배열의 마지막 행부터 시작
            for (int j = 0; j < n; j++) { // 원래 배열의 행 인덱스
                degreed[i][k--] = box[j][i]; // 회전 결과를 저장
            }
        }

        return degreed; // 회전된 박스 반환
    }
}

 

 

> python

 

from typing import List

class Solution:
    def rotateTheBox(self, box: List[List[str]]) -> List[List[str]]:
        n = len(box)
        m = len(box[0])

        # 올바른 배열 초기화
        degreed = [[0] * n for _ in range(m)]

        # 각 행에서 돌을 오른쪽으로 이동
        for i in range(n):
            for j in range(m - 1, -1, -1):
                if box[i][j] == '#':
                    idx = j + 1
                    # 오른쪽으로 이동 가능한 위치 탐색
                    while idx < m and box[i][idx] == '.':
                        idx += 1
                    # 이동 가능한 경우 위치 변경
                    if idx != j + 1:
                        box[i][idx - 1] = '#'
                        box[i][j] = '.'

        # 90도 회전
        for i in range(m):
            for j in range(n):
                degreed[i][n - j - 1] = box[j][i]

        return degreed