본문 바로가기
공부/알고리즘

[백준]16926_배열돌리기1_Java 풀이

by happyeuni 2022. 2. 9.

https://www.acmicpc.net/problem/16926

 

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

제한사항:

  • O(N*M*R) = 300 * 300 * 1000 * min(N,M)/2
  • min(N,M) mod 2 = 0    : N,M중 작은 값은 2의 배수

 

<풀이>

  • 배열을 시계 방향으로 돌려야함 - 바깥쪽부터 안쪽으로 돌아가면서 돌리도록 작성
  • 바깥쪽에서 몇번째 줄인지 확인하기 위해 변수 count 사용. 안으로 들어갈때마다 1개씩 늘려주며 index 잘 만들어줌
  • 주의할 점은 println으로 할 경우 시간이 많이 걸리는데 StringBuilder를 쓰자 반으로 줄었다.  
    아래는 println, 위는 StringBuilder 사용
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_16926 {
	static int N,M,R;
	static int map[][], after[][];
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder("");
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		R = Integer.parseInt(st.nextToken());
		map = new int [N+1][M+1]; //인덱스 1부터 시작하도록
		after = new int [N+1][M+1];
		for(int i=1;i<=N;i++) {
			st = new StringTokenizer(br.readLine());
			for(int j=1;j<=M;j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}//-입력 끝
		rotate(R); // count: 바깥에서부터 몇번째 줄 할 차례인지

		for(int i=1;i<=N;i++) {
			for(int j=1;j<=M;j++) {
//				System.out.print(map[i][j]+ " ");
				sb.append(map[i][j]).append(" ");
			}
//			System.out.println();
			sb.append("\n");
		}
		System.out.println(sb.toString());
	}
	
	public static void rotate(int R) {
		if(R==0) return;
		int count = 1;
		while(true) {
			if(count >(M/2) || count > (N/2)) {//count가 N,M길이의 반을 넘어가면 돌릴 이유 X->종료
				break;
			}
			for(int i=count;i<M+1-count;i++) {
				after[count][i] = map[count][i+1];//위
				after[N+1-count][i+1] = map[N+1-count][i];//아래
			}
			
			for(int i=count;i<N+1-count;i++) {
				after[i+1][count] = map[i][count];//왼쪽
				after[i][M+1-count] = map[i+1][M+1-count];//오른쪽
			}
			count++;
		}
		for(int i=1;i<=N;i++) {
			for(int j=1;j<=M;j++) {
				map[i][j] = after[i][j];
			}
		}
		rotate(--R);
		
	}

}

https://github.com/LeeJieuni/Algorithm/blob/main/BOJ/Main_16926_%EC%9D%B4%EC%A7%80%EC%9D%80.java

 

GitHub - LeeJieuni/Algorithm

Contribute to LeeJieuni/Algorithm development by creating an account on GitHub.

github.com

 

댓글