문제 타입
- 시뮬레이션 문제:
- 2차원 배열을 특정 규칙에 따라 변환.
- 돌(‘#’), 장애물(‘*’), 빈 공간(‘.’)의 상호작용을 처리.
- 배열을 90도 회전하여 새로운 형태로 출력.
문제 분석
- 주어진 작업:
- 각 행의 돌(‘#’)을 오른쪽으로 가능한 한 이동.
- 장애물(‘*’)이나 다른 돌을 만나면 더 이상 이동 불가.
- 이동 후에는 빈 공간(‘.’)으로 채워야 함.
- 박스를 오른쪽으로 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
'TIL' 카테고리의 다른 글
[코테연습] 773. Sliding Puzzle (0) | 2024.11.25 |
---|---|
[코테연습] 1975. Maximum Matrix Sum (0) | 2024.11.24 |
[코테연습] 1072. Flip Columns For Maximum Number of Equal Rows (0) | 2024.11.22 |
[코테연습] 2257. Count Unguarded Cells in the Grid (0) | 2024.11.21 |
[코테연습] 2516. Take K of Each Character From Left and Right (1) | 2024.11.20 |