Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 스프링부트 도커
- lv2
- Programmers
- java
- 큐
- 백준
- StringTokenizer
- COS Pro
- Queue
- 프로그래머스 자바
- 스프링부트 도커 배포
- 프로그래머스 문자열 정렬
- 버퍼
- Lv1
- SWEA
- 삼각형의 완성조건
- 문자열
- 알고리즘
- 스프링부트 도커로 배포
- 스택
- 프로그래머스 풀이
- 프로그래머스
- 클라이언트
- 백준 N과 M 자바
- 이진수 변환
- 오름차순 정렬
- 자바
- index of
- Stack
- lv0
Archives
- Today
- Total
mun dev
[백준] 17276 배열 돌리기 자바(Java) 본문
문제설명
크기가 n x n인 2차원 정수 배열 X가 있다. (n은 홀수)
X를 45° 의 배수만큼 시계방향 혹은 반시계방향으로 돌리려고 한다. X를 시계 방향으로 45° 돌리면 아래와 같은 연산이 동시에 X에 적용되어야 한다:
- X의 주 대각선을 ((1,1), (2,2), …, (n, n)) 가운데 열 ((n+1)/2 번째 열)로 옮긴다.
- X의 가운데 열을 X의 부 대각선으로 ((n, 1), (n-1, 2), …, (1, n)) 옮긴다.
- X의 부 대각선을 X의 가운데 행 ((n+1)/2번째 행)으로 옮긴다.
- X의 가운데 행을 X의 주 대각선으로 옮긴다.
- 위 네 가지 경우 모두 원소의 기존 순서는 유지 되어야 한다.
- X의 다른 원소의 위치는 변하지 않는다.
반시계 방향으로 45° 돌리는 경우도 위와 비슷하게 정의된다.
예를 들어, 아래 그림 중앙에 5x5 배열 X가 있고, 이 배열을 시계방향 혹은 반시계방향으로 45° 돌렸을 때의 결과가 우측 그리고 좌측에 있다. 굵은 원소는 주 대각선 / 중간 열 / 부 대각선 / 중간 행에 위치한 원소이다.

입력으로 2차원 배열 X와 어느 방향으로 몇 도 회전할지 입력 받아, 그 결과를 출력하는 프로그램을 작성하시오.
입력
첫 줄에 테스트 케이스의 수 T가 주어진다 (1 ≤ T ≤ 10).
각 테스트 케이스에 대해: 첫 줄에 배열의 크기를 나타내는 n (1 ≤ n < 500, n은 홀수) 그리고 각도 d가 주어진다. d는 0 ≤ |d| ≤ 360 을 만족하며 |d| 는 45의 배수이다. d가 양수이면 시계방향으로 d° 돌려야 하고, 음수이면 반시계방향으로 |d|° 돌려야 한다. 다음 n줄에 걸쳐 각 줄에 n개의 정수가 공백으로 구분되어 주어진다 (X의 원소들을 나타낸다). 각 값은 1 이상 1,000,000 이하의 정수이다.
출력
각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다.
통과한 코드 ✅
import java.util.*;
import java.io.*;
public class Main {
static int n, d;
static int arr[][];
static int result[][];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int t = Integer.parseInt(br.readLine());
for (int i = 0; i < t; i++) {
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
d = Integer.parseInt(st.nextToken());
if (d < 0) d += 360; //음수라면 해당 값에서 360 더하기
d /= 45; // 나누어서 d만큼만 배열 돌리기
arr = new int[n][n];
result = new int[n][n];
for (int j = 0; j < n; j++) {
st = new StringTokenizer(br.readLine());
for (int k = 0; k < n; k++) {
arr[j][k] = Integer.parseInt(st.nextToken());
result[j][k] = arr[j][k]; // 배열복사
}
}
while (d > 0) {
for (int j = 0; j < n; j++) {
result[j][n / 2] = arr[j][j]; // 0,2부터 배열 돌리기 0,2=0,0
result[j][j] = arr[n / 2][j]; // 0,0 =2,0
result[n / 2][j] = arr[n - j - 1][j]; // 2,0 =4,0
result[n - j - 1][j] = arr[n - j - 1][n / 2]; // 4,0=4,2
}
d--; //한 번 수행했으니 카운트 감소
for (int k = 0; k < n; k++) {
for (int l = 0; l < n; l++) {
arr[k][l] = result[k][l]; //배열 복사
}
}
}
for (int[] res : arr) {
for (int a : res)
sb.append(a + " ");
sb.append("\n");
}
}
System.out.println(sb);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 14888 연산자 끼워넣기 자바(Java) (0) | 2023.05.16 |
---|---|
[백준] 13241 최소공배수 자바(Java) (0) | 2023.05.14 |
[백준] 1193 분수찾기 자바(Java) (1) | 2023.05.11 |
[백준] 1436 영화감독 숌 자바(Java) (0) | 2023.05.11 |
[백준] 1802 종이접기 자바(Java) (0) | 2023.05.09 |