728x90
문제
https://www.acmicpc.net/problem/16926
주어진 N x M 크기의 2차원 배열과 정수 R이 주어집니다. 배열의 각 층을 시계 방향으로 R번 회전시키는 문제입니다. 배열의 크기와 회전 횟수에 따라 각 층이 어떻게 변하는지 구현하는 문제입니다.
접근 방법
- 층 분리:
- 배열을 층별로 나누어 각 층을 별도로 다룹니다. 각 층은 외부에서 내부로 원형으로 구성된 요소들의 집합입니다.
- 회전 처리:
- 각 층을 회전시키기 위해, 우선 각 층을 1차원 배열로 변환한 뒤 회전한 후, 다시 2차원 배열로 복원합니다.
- 출력:
- 변환된 배열을 출력합니다.
해결 방법
- 층 분리:
- 각 층의 시작과 끝 좌표를 정의하고, 해당 좌표에 위치한 요소들을 1차원 배열로 변환합니다.
- 회전 처리:
- 1차원 배열로 변환된 층을 시계 방향으로 회전합니다. 회전은 배열의 인덱스를 계산하여 처리합니다.
- 복원:
- 회전된 1차원 배열을 다시 2차원 배열의 해당 층에 배치합니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int R = Integer.parseInt(st.nextToken());
int[][] array = new int[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
array[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int i=0; i<R; i++) {
for(int j=0; j< Math.min(N, M)/2; j++) {
int temp = array[j][j];
for(int k=j; k<M-j-1; k++) {
array[j][k] = array[j][k+1];
}
for(int k=j; k<N-1-j; k++) {
array[k][M-j-1] = array[k+1][M-j-1];
}
for(int k=M-j-1; k>j; k--) {
array[N-1-j][k] = array[N-1-j][k-1];
}
for(int k=N-j-1; k>j; k--) {
array[k][j] = array[k-1][j];
}
array[j+1][j] = temp;
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
sb.append(array[i][j]).append(" ");
}
sb.append("\n");
}
System.out.print(sb);
}
}
메모리:31716kb 시간:684ms
728x90
'IT 개발 관련 > [Algorithm]' 카테고리의 다른 글
[백준] 1417번: 국회의원 선거 - Java (0) | 2024.08.22 |
---|---|
[백준] 1072번 : 게임 - Java (0) | 2024.08.02 |
[백준] 2501번 : 약수 구하기 - Java (0) | 2024.06.23 |
[백준] 1251번 : 단어 나누기 - Java (0) | 2024.06.22 |
[백준] 18352번 : 특정 거리의 도시 찾기 - Java (0) | 2024.06.21 |