[백준] 16926번 배열돌리기1 (java)

728x90
반응형

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

1에서만 가능한 풀이인듯.. 어떻게 할지 고민하느라 손가는 대로 풀었는데 한번에 현재 위치+r에 있는 원소를 가져오는 방법을 강구해야 다음 난이도 문제들이 풀릴 것 같다. 

 

import java.util.Scanner;

public class Main {
	static int n,m,r;
	static int[][] map;
	static int[][] n_map;
	static int ypos[]= {1,0,-1,0};
	static int xpos[]= {0,1,0,-1};
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		n=sc.nextInt();
		m=sc.nextInt();
		r=sc.nextInt();
		map=new int[n][m];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j <m; j++) {
				map[i][j]=sc.nextInt();
			}
			
		}
		for (int i = 0; i < r; i++) {
			rotate();
		}
		
		for (int i = 0; i < n; i++) {
			for (int j = 0; j <m; j++) {
				System.out.print(map[i][j]+" ");
			}
			System.out.println();
		}
		
	}
	private static void go(int l,int k,int sy,int sx) {
		int cnt=0;
		int dir=0;
		int y=sy;
		int x=sx;
		int temp=map[y][x];
		while(cnt!=2*(l+k)-4) {
			int yy=y+ypos[dir];
			int xx=x+xpos[dir];
			
			if(yy<sy ||xx<sx || yy>sy+l-1 ||xx>sx+k-1) {
				dir=(dir+1)%4;
				continue;
			}
			int temp2=map[yy][xx];
			map[yy][xx]=temp;
			temp=temp2;
			y=yy;
			x=xx;
			cnt+=1;
		}
	}
	private static void rotate() {
		int sx=0; int sy=0; 
		int n_len=n; int m_len=m;
		while(n_len>=2 && m_len>=2) {
			go(n_len,m_len,sx++,sy++);
			n_len-=2;
			m_len-=2;
		}
		
	}
	
}
728x90
반응형
TAGS.

Comments