16926번: 배열 돌리기 1
크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]
www.acmicpc.net


의식의 흐름
돌려야하는 줄이 몇 개인지 구하고 하나씩 반시계로 돌려보자
풀이 과정
1. 배열의 크기(N, M), 회전의 수(rotCnt)를 입력받는다.
2. 배열(nums)의 원소를 입력받는다.
3. 각각의 줄을 반시계방향으로 돌린다.
3-1) 돌려야하는 줄의 개수 = Math.min(N,M)/2

문제 조건 => min(N, M) mod 2 = 0
N=4, M=4인 경우) 돌려야하는 줄의 개수 = Math.min(4,4)/2 = 2개
N=6, M=7인 경우) 돌려야하는 줄의 개수 = Math.min(6,7)/2 = 3개
3-2) 왼쪽, 위, 오른쪽, 아래 순으로 차례대로 숫자를 옮긴다.
int tmp = nums[i][i];
for(int j=i;j
nums[i][j] = nums[i][j+1];
}
for(int j=i;j
nums[j][M-i-1] = nums[j+1][M-i-1];
}
for(int j=M-i-1;j>i;j--){ // 오른쪽으로 이동
nums[N-i-1][j] = nums[N-i-1][j-1];
}
for(int j=N-i-1;j>i;j--){ // 아래쪽으로 이동
nums[j][i] = nums[j-1][i];
}
nums[i+1][i] = tmp;
4. 3번 과정을 rotCnt만큼 반복한다.
5. nums를 출력한다.
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static int N,M,rotCnt;
public static int[][] nums;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
rotCnt = Integer.parseInt(st.nextToken());
nums = new int[N][M];
for(int i=0;i<N;i++){
st = new StringTokenizer(br.readLine());
for(int j=0;j<M;j++){
nums[i][j] = Integer.parseInt(st.nextToken());
}
}
while(rotCnt-->0){
rotateMatrix();
}
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
bw.write(nums[i][j]+" ");
}
bw.write("\n");
}
bw.flush();
br.close();
bw.close();
}
public static void rotateMatrix(){
int rotateLineCnt = Math.min(N,M)/2;
for(int i=0;i<rotateLineCnt;i++){
int tmp = nums[i][i];
for(int j=i;j<M-i-1;j++){ // 왼쪽으로 이동
nums[i][j] = nums[i][j+1];
}
for(int j=i;j<N-i-1;j++){ // 위로 이동
nums[j][M-i-1] = nums[j+1][M-i-1];
}
for(int j=M-i-1;j>i;j--){ // 오른쪽으로 이동
nums[N-i-1][j] = nums[N-i-1][j-1];
}
for(int j=N-i-1;j>i;j--){ // 아래쪽으로 이동
nums[j][i] = nums[j-1][i];
}
nums[i+1][i] = tmp;
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[JAVA] 백준 q17626 - Four Squares (2) | 2023.11.28 |
---|---|
[JAVA] 백준 q21608 - 상어 초등학교 (2) | 2023.11.22 |
[JAVA] 백준 q22945 - 팀 빌딩 (2) | 2023.11.20 |
[JAVA] 백준 q22862 - 가장 긴 짝수 연속한 부분 수열 (large) (0) | 2023.11.20 |
[JAVA] 백준 q20922 - 겹치는 건 싫어 (2) | 2023.10.30 |
16926번: 배열 돌리기 1
크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]
www.acmicpc.net


의식의 흐름
돌려야하는 줄이 몇 개인지 구하고 하나씩 반시계로 돌려보자
풀이 과정
1. 배열의 크기(N, M), 회전의 수(rotCnt)를 입력받는다.
2. 배열(nums)의 원소를 입력받는다.
3. 각각의 줄을 반시계방향으로 돌린다.
3-1) 돌려야하는 줄의 개수 = Math.min(N,M)/2

문제 조건 => min(N, M) mod 2 = 0
N=4, M=4인 경우) 돌려야하는 줄의 개수 = Math.min(4,4)/2 = 2개
N=6, M=7인 경우) 돌려야하는 줄의 개수 = Math.min(6,7)/2 = 3개
3-2) 왼쪽, 위, 오른쪽, 아래 순으로 차례대로 숫자를 옮긴다.
int tmp = nums[i][i];
for(int j=i;j
nums[i][j] = nums[i][j+1];
}
for(int j=i;j
nums[j][M-i-1] = nums[j+1][M-i-1];
}
for(int j=M-i-1;j>i;j--){ // 오른쪽으로 이동
nums[N-i-1][j] = nums[N-i-1][j-1];
}
for(int j=N-i-1;j>i;j--){ // 아래쪽으로 이동
nums[j][i] = nums[j-1][i];
}
nums[i+1][i] = tmp;
4. 3번 과정을 rotCnt만큼 반복한다.
5. nums를 출력한다.
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static int N,M,rotCnt;
public static int[][] nums;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
rotCnt = Integer.parseInt(st.nextToken());
nums = new int[N][M];
for(int i=0;i<N;i++){
st = new StringTokenizer(br.readLine());
for(int j=0;j<M;j++){
nums[i][j] = Integer.parseInt(st.nextToken());
}
}
while(rotCnt-->0){
rotateMatrix();
}
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
bw.write(nums[i][j]+" ");
}
bw.write("\n");
}
bw.flush();
br.close();
bw.close();
}
public static void rotateMatrix(){
int rotateLineCnt = Math.min(N,M)/2;
for(int i=0;i<rotateLineCnt;i++){
int tmp = nums[i][i];
for(int j=i;j<M-i-1;j++){ // 왼쪽으로 이동
nums[i][j] = nums[i][j+1];
}
for(int j=i;j<N-i-1;j++){ // 위로 이동
nums[j][M-i-1] = nums[j+1][M-i-1];
}
for(int j=M-i-1;j>i;j--){ // 오른쪽으로 이동
nums[N-i-1][j] = nums[N-i-1][j-1];
}
for(int j=N-i-1;j>i;j--){ // 아래쪽으로 이동
nums[j][i] = nums[j-1][i];
}
nums[i+1][i] = tmp;
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[JAVA] 백준 q17626 - Four Squares (2) | 2023.11.28 |
---|---|
[JAVA] 백준 q21608 - 상어 초등학교 (2) | 2023.11.22 |
[JAVA] 백준 q22945 - 팀 빌딩 (2) | 2023.11.20 |
[JAVA] 백준 q22862 - 가장 긴 짝수 연속한 부분 수열 (large) (0) | 2023.11.20 |
[JAVA] 백준 q20922 - 겹치는 건 싫어 (2) | 2023.10.30 |