본문 바로가기
알고리즘/Samsung

SW 1961. 숫자 배열 회전

by son_i 2023. 4. 27.
728x90

SW Expert Academy

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

처음에 원본 배열을 90도 180도 270도를 각각 회전시키는 2중 반복문을 3개 만들었다.

그런데 출력 형식을 못 맞추겠는 거야 !

 

생각을 좀 하다가 일단 저것도 각각 구현할 필요가 없다고 느껴져서

rotation이라는 함수를 만들어서 90도 회전시키고 배열을 반환하게 했음.

그리고 180도 회전한건 90도 회전한 함수를 써서 나온 배열에 또 rotation 함수를 적용시켜주면 되는 것 !

package algorithm;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;

/*
   사용하는 클래스명이 Solution 이어야 하므로, 가급적 Solution.java 를 사용할 것을 권장합니다.
   이러한 상황에서도 동일하게 java Solution 명령으로 프로그램을 수행해볼 수 있습니다.
 */
public class Solution
{
	public static void main(String args[]) throws Exception
	{
		//System.setIn(new FileInputStream("C:\\so_Project\\workspace\\BaekJoon\\src\\algorithm\\input.txt"));

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int T = Integer.parseInt(br.readLine()); //테스트 케이스
	
		for(int i=1;i<=T;i++) { //하나의 테스트케이스마다 반복
			int N = Integer.parseInt(br.readLine());
			int arr[][] = new int[N][N];
			int arr_90[][] = new int[N][N];
			int arr_180[][] = new int[N][N];
			int arr_270[][] = new int[N][N];
			
			for(int j=0;j<N;j++) { // N*N 행렬값 저장
				StringTokenizer st = new StringTokenizer(br.readLine());
				for(int k=0;k<N;k++) {
					arr[j][k] = Integer.parseInt(st.nextToken());
				}
			}
			arr_90 = rotation(arr,N);
			arr_180 = rotation(arr_90,N);
			arr_270 = rotation(arr_180,N);
			
			System.out.println("#"+i+" ");
			
			for(int k=0;k<N;k++) {
				for(int m = 0;m<N;m++) {
					System.out.print(arr_90[k][m]);
				}
				System.out.print(" ");
				for(int m = 0;m<N;m++) {
					System.out.print(arr_180[k][m]);
				}
				System.out.print(" ");
				for(int m = 0;m<N;m++) {
					System.out.print(arr_270[k][m]);
				}
				System.out.println(" ");
			}
		}//하나의 테스트 케이스마다 반복문 끝
	}
	public static int[][] rotation(int arr[][],int N){
		int num[][] = new int[N][N];
		int i=0;
		for(int j=0;j<N;j++) { //열
			int o=0;
			for(int k=N-1;k>=0;k--) { //행
				num[i][o] = arr[k][j];
				o++;
			}
			i++;
		}
		return num;
	}
}

근데 이제 rotation함수에서 나는 90도 회전하는 반복문을 만들어 새로운 배열 0,0 0,1 ... 해서 채워줬는데

아예 규칙을 찾아서 해주는 법도 있는 것 같다.

 

123            에서          741   이 되는 거니까

456                             852

789                             963

좌표의 변화는

0,0 -> 0,2  /   0,1 -> 1,1  / 0,2 -> 2,2  /  1,0 -> 0,1  /  1,1 -> 1,1  /  1,2 -> 2,1 /2,0->0,0/ 2,1-> 1,0/2,2->2,0

이런식..  이렇게 보면 규칙을 찾기 힘든데  X좌표 증가하는 순으로 정렬해보면

2,0 -> 0,0  / 1,0 -> 0,1  /  0,0 -> 0,2  / 으로 x좌표는 최대 인덱스에서 시작 점점 줄어든다.

한 번 고쳐보자. 

for(int i=0;i<N;i++) {
			for(int j=0;j<N;j++) {
				num[i][j] = arr[N-1-j][i];
			}
		}

요렇게 고쳤다 ~ 정말 간단 !

 

'알고리즘 > Samsung' 카테고리의 다른 글

SW 1946. 간단한 압축 풀기  (0) 2023.05.02
SW 1948. 날짜 계산기  (0) 2023.05.02
SW 1983.조교의 성적 매기기  (1) 2023.04.18
SW 2001. 파리퇴치  (0) 2023.04.18
SW 2005. 파스칼의 삼각형  (0) 2023.04.14