[백준] 16926: 배열 돌리기 1 (Java)

Yoon Uk·2022년 8월 6일
0

알고리즘 - 백준

목록 보기
48/130
post-thumbnail
post-custom-banner

문제

BOJ 16926: 배열 돌리기 1 https://www.acmicpc.net/problem/16926

풀이

조건

  • 회전시킬 수 있는 그룹 별로 반시계 방향으로 회전시킨다.

풀이 순서

  • 회전시켜야 하는 그룹의 갯수를 구한다.
    • Math.min(N, M) / 2
    • 예를 들어, 2 X 2 행렬에서는 1개, 5 X 4 행렬에서는 2개이다.
  • 구한 그룹의 갯수 만큼 반복하여 회전시킨다.
    1. 윗쪽 변에서 왼쪽으로 넣는 연산
    2. 오른쪽 변에서 윗쪽으로 넣는 연산
    3. 아랫쪽 변에서 오른쪽으로 넣는 연산
    4. 왼쪽 변에서 아랫쪽으로 넣는 연산
      순으로 구현하였다.
  • 이 때 맨 처음의 (0, 0) / (1, 1) / .. 의 값은 temp 변수에 따로 저장하여 마지막에 (1, 0) / (2, 1) .. 의 자리에 넣어주었다.
  • while문을 사용하여 회전시키며 값을 넣어주는 부분을 구현하였다.

코드

import java.util.*;
import java.io.*;

public class Main {
    
	static int N, M, R;
	static int min;
	static int[][] map;
	
	static int[] dx = {0, 1, 0, -1}; // 왼쪽으로 넣는, 위로 넣는, 오른쪽으로 넣는, 아래로 넣는
	static int[] dy = {1, 0, -1, 0};
    
    public static void main(String[] args) throws IOException {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	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][M];
    	for(int i=0; i<N; i++) {
    		st = new StringTokenizer(br.readLine(), " ");
    		for(int j=0; j<M; j++) {
    			map[i][j] = Integer.parseInt(st.nextToken());
    		}
    	}
    	
    	min = Math.min(N, M); // 행, 열 중 더 작은 것 구함
    	
    	for(int i=1; i<=R; i++) { // 회전 횟수만큼 회전시킴
    		rotate();
    	}
    	
    	// 결과 출력
    	print();
    }
    
    // 회전 시키는 메소드
    static void rotate() {
    	
    	for(int t=0; t<min/2; t++) { // 회전 시킬 그룹의 갯수 구하기
    		int x = t;
    		int y = t;
    		
    		int temp = map[x][y]; // 마지막에 넣을 값 미리 빼놓음
    		
    		int idx = 0; // 우, 하, 좌, 상 방향으로 이동하며 반시계 방향으로 값 넣을 인덱스
    		while(idx < 4) { // 왼쪽으로 넣는, 위로 넣는, 오른쪽으로 넣는, 아래로 넣는 연산을 차례로 수행
    			int nx = x + dx[idx];
    			int ny = y + dy[idx];
    			
    			// 범위 안이라면
    			if(nx < N-t && ny < M-t && nx >= t && ny >= t) {
    				map[x][y] = map[nx][ny];
    				x = nx;
    				y = ny;
    			} 
    			// 범위를 벗어났다면 다음 방향으로 어감
    			else {
    				idx++;
    			}
    			
    		}
    		
    		map[t+1][t] = temp; // 빼 놓은 값 넣어 줌
    	}
    	
    }
    
    // 출력 함수
    static void print() {
    	for(int i=0; i<N; i++) {
    		for(int j=0; j<M; j++) {
    			System.out.print(map[i][j] + " ");
    		}
    		System.out.println();
    	}
    	System.out.println();
    }
}

정리

  • 처음에 왼쪽으로 넣는, 위로 넣는, 오른쪽으로 넣는, 아래로 넣는 연산을 각각 따로 구현했었는데 더 쉬운 방법으로 구현했다.
post-custom-banner

0개의 댓글