문제

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

분석/설계

회전을 할 각 라인의 개수와 구한 각 라인을 반복하여 회전시켜야합니다.

 

1. 입력받은 문자열을 각각의 문자로 쪼개 확인합니다.

2. 회전을 할 각 라인의 개수를 구합니다.

    2X2  = 2개, 4X4 = 2개, 5x4 = 2개, 6x4 = 2개....

    Math.min(N, M) / 2  

3. 구한 각 라인을 반복하여 회전시킵니다.

   이때 회전하는 방향을 유의해야하고 각 시작점(0,0) ... (1,1)는 임시 변수에 저장했다가 이동한 위치로 (1,0) ... (2,1)

   반복이 끝날때 값을 넣어줍니다. 

 

구현 코드

import java.util.Scanner;

public class Main {
	static int M, N, R; // 가로, 새로, 회전 수
	static int [][] arr;
	static int[] dx = {0, 1, 0, -1}; 
	static int[] dy = {1, 0, -1, 0};
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		// 1. 입력받은 문자열을 각각의 문자로 쪼개 확인합니다.
		N = sc.nextInt();
		M = sc.nextInt();
		R = sc.nextInt();
		arr = new int[N][M];
		
		for (int i=0; i<N; i++) {
			for (int j=0; j<M; j++) {
				arr[i][j] = sc.nextInt(); 
			}
		}
		
        // 2. 회전을 할 각 라인의 개수를 구합니다.
		int line = Math.min(N, M) / 2;
		
        // 3. 구한 각 라인을 반복하여 회전시킵니다.
		for (int i=0; i<R; i++) { 
			for (int j=0; j<line; j++) { 
				int x = j;
				int y = j;
				int val = arr[x][y];
				int idx = 0;
				
				while(idx<4) {
					int mx = x + dx[idx];
					int my = y + dy[idx];
					
					if (mx >= j && mx < N-j && my >= j && my < M-j) {
						arr[x][y] = arr[mx][my];
						x = mx;
						y = my;
					} else {
						idx++;
					}	
				}
				arr[j+1][j] = val;
			}
		}
		
		for (int i=0; i<N; i++) {
			for(int j=0; j<M; j++) {
				System.out.print(arr[i][j] + " ");
			}
			System.out.println();
		}
		
		sc.close();
	}
}

정리

각 라인 별로 어떻게 값 이동을 구현할지를 각 라인의 수를 어떻게 구할지 

처음 접하면 떠오르지 않습니다. 

기존 맵의 탐색하는 유형은 많이 만나봐서 그런 방식으로 접근을 했고,

각 라인의 범위를 침범하지 않은 채로 이동을 해야했기때문에 많은 고심을 한 문제입니다.

백준 사이트에 보면 이런 유형의 문제가 많으니 많이 접해보고 다른분들의 풀이도 보면 도움이 되지 않을까 싶습니다.

참고

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

'Algorithm > 구현' 카테고리의 다른 글

[백준] 참외밭  (0) 2022.12.23
[백준] 마인크래프트  (0) 2022.12.23
괄호의 값  (1) 2022.12.14
구현 - 문자열 재정렬  (0) 2022.03.17

+ Recent posts