[백준] 16935번 배열돌리기3 (JAVA, C++)

728x90
반응형

 

www.acmicpc.net/problem/16935

 

16935번: 배열 돌리기 3

크기가 N×M인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 총 6가지가 있다. 1번 연산은 배열을 상하 반전시키는 연산이다. 1 6 2 9 8 4 → 4 2 9 3 1 8 7 2 6 9 8 2 → 9 2 3 6 1 5 1 8 3 4 2 9 →

www.acmicpc.net

 

 

1. JAVA

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	static int n,m,r;
	static int[][] map;
	public static void main(String[] args) throws IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		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());
			}
		}
		st=new StringTokenizer(br.readLine());
		for (int i = 0; i < r; i++) {
			int x=Integer.parseInt(st.nextToken());
			if(x==1) {
				one();
			}else if(x==2) {
				two();
			}else if(x==3) {
				three();
			}else if(x==4) {
				four();
			}else if(x==5) {
				five();
			}else if(x==6) {
				six();
			}
		}
		
		
		for (int i = 0; i < map.length; i++) {
			for (int j = 0; j < map[0].length; j++) {
				System.out.print(map[i][j]+" ");
			}
			System.out.println();
		}
		
		
	}
	
	private static void one() {
		for (int j = 0; j < m; j++) {
			for (int i = 0; i < n/2; i++) {
				int temp=map[i][j];
				map[i][j]=map[n-1-i][j];
				map[n-1-i][j]=temp;
			}
		}
	}
	
	private static void two() {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m/2; j++) {
				int temp=map[i][j];
				map[i][j]=map[i][m-1-j];
				map[i][m-1-j]=temp;
			}
		}
	}
	private static int[][] deepCopy(){
		int[][] res=new int[n][m];
		for (int i = 0; i < n; i++) {
			System.arraycopy(map[i], 0, res[i], 0, m);
		}
		return res;
	}
	private static void three() {
		int[][] n_map=deepCopy();
		map=new int[m][n];
		int temp=n;
		n=m;
		m=temp;
		for (int j = 0; j < m; j++) {
			for (int i = 0; i < n; i++) {
				map[i][j]=n_map[m-1-j][i];
			}
		}
	}
	
	private static void four() {
		int[][] n_map=deepCopy();	
		map=new int[m][n];
		int temp=n;
		n=m;
		m=temp;
		for (int j = 0; j < n; j++) {
			for (int i = 0; i <m; i++) {
				map[n-1-j][i]=n_map[i][j];
			}
		}
	}
	
	private static void five() {
		int[][] n_map=deepCopy();
		map=new int[n][m];
//		1번영역에 4번 복사
		for (int i = n/2; i < n; i++) {
			for (int j = 0; j < m/2; j++) {
				map[i-n/2][j]=n_map[i][j];
			}
		}
//		2번 영역에 1번 복사 
		for (int i = 0; i < n/2; i++) {
			for (int j = 0; j < m/2; j++) {
				map[i][j+m/2]=n_map[i][j];
			}
		}
//		3번 영역에 2번 복사 
		for (int i = 0; i < n/2; i++) {
			for (int j = m/2; j < m; j++) {
				map[i+n/2][j]=n_map[i][j];
			}
		}
//		4번 영역에 3번 복사
		for (int i = n/2; i < n; i++) {
			for (int j = m/2; j <m; j++) {
				map[i][j-m/2]=n_map[i][j];
			}
		}
		
	}
	
	private static void six() {
		int[][] n_map=deepCopy();
		map=new int[n][m];
//		4번 영역에 1번 복사 
		for (int i = 0; i < n/2; i++) {
			for (int j = 0; j < m/2; j++) {
				map[i+n/2][j]=n_map[i][j];
			}
		}
//		3번영역에 4번 복사
		for (int i = n/2; i < n; i++) {
			for (int j = 0; j < m/2; j++) {
				map[i][j+m/2]=n_map[i][j];
			}
		}
		
//		2번 영역에 3번 복사
		for (int i = n/2; i < n; i++) {
			for (int j = m/2; j <m; j++) {
				map[i-n/2][j]=n_map[i][j];
			}
		}

//		1번 영역에 2번 복사 
		for (int i = 0; i < n/2; i++) {
			for (int j = m/2; j < m; j++) {
				map[i][j-m/2]=n_map[i][j];
			}
		}

		
	}
	}
	

 

2. C++

 

#include <iostream>
using namespace std;


#define MAX 101

int n,m,r;
int a[MAX][MAX];
int temp[MAX][MAX];

void copy(){
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			temp[i][j]=a[i][j]; 
		}
	}
}

void updown(){
	copy();
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			a[n-i-1][j]=temp[i][j]; 
		}
	}
}

void lr(){
	copy();
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			a[j][m-i-1]=temp[j][i]; 
		}
	}
}

void clock(){
	copy();
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			a[j][n-i-1]=temp[i][j]; 
		}
	}
	int tmp=n;
	n=m;
	m=tmp; // 행열 사이즈 바꿔주기 
}

void cclock(){
	copy();
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			a[m-j-1][i]=temp[i][j]; 
		}
	}
	int tmp=n;
	n=m;
	m=tmp; // 행열 사이즈 바꿔주기 
} 

void five(){
	copy();
	for(int i=0;i<n/2;i++){
		for(int j=0;j<m/2;j++){
			a[i][j+m/2]=temp[i][j];
		}
	}
	for(int i=0;i<n/2;i++){
		for(int j=m/2;j<m;j++){
			a[i+n/2][j]=temp[i][j];
		}
	}
	for(int i=n/2;i<n;i++){
		for(int j=m/2;j<m;j++){
			a[i][j-m/2]=temp[i][j];
		}
	}
	
	for(int i=n/2;i<n;i++){
		for(int j=0;j<m/2;j++){
			a[i-n/2][j]=temp[i][j];
		}
	}
}

void six(){
	
	copy();
	for(int i=0;i<n/2;i++){
		for(int j=0;j<m/2;j++){
			a[i+n/2][j]=temp[i][j];
		}
	}
	
	for(int i=n/2;i<n;i++){
		for(int j=0;j<m/2;j++){
			a[i][j+m/2]=temp[i][j];
		}
	}
	
	
	for(int i=n/2;i<n;i++){
		for(int j=m/2;j<m;j++){
			a[i-n/2][j]=temp[i][j];
		}
	}
	
	for(int i=0;i<n/2;i++){
		for(int j=m/2;j<m;j++){
			a[i][j-m/2]=temp[i][j];
		}
	}
		
	
}

 
int main(void){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	
	cin>>n>>m>>r;
	
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cin>>a[i][j];
		}
	}
	int num;
	for(int i=0;i<r;i++){
		cin>>num;
		switch(num){
			case 1:
				updown();
				break;
			case 2:
				lr();
				break;
			case 3:
				clock();
				break;
			case 4:
				cclock();
				break;
			case 5:
				five();
				break;
			case 6:
				six();
				break;
		}
	}
	
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cout<<a[i][j]<<" ";
		}
		cout<<"\n";
	}
	

	return 0;
}
728x90
반응형
TAGS.

Comments