SWEA 1961 숫자 배열 회전 (Java, Kotlin)

: ) YOUNG·2022년 7월 4일
1

알고리즘

목록 보기
158/422

SWEA 1961번
https://swexpertacademy.com/main/code/problem/problemDetail.do

문제



N x N 행렬이 주어질 때,

다음 N줄에 걸쳐서 90도, 180도, 270도 회전한 모양을 출력한다.

입력과는 달리 출력에서는 회전한 모양 사이에만 공백이 존재함에 유의하라.

(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)


생각하기


  • 배열돌리는 것 보다 출력이 더 까다롭다..

동작

처음에 배열의 값을 직접 돌려서 복사한다고 구현하는 것 땜에 시간을 잡아먹었는데, 굳이 그럴 필요 없이 그냥 배열을 가로를 세로로 배치만 하면 되는 것이어서 생각보다 간단했다.

근데 출력이 조금 많이 까다로웠는데, 그냥 출력을 위한 String 2차원 배열을 만들어서 하니까 좀 수월했다.

			for(int i=1; i<=3; i++) {
				rotation(i); // 90도 단위로 회전, 90, 180, 270 총 3번 회전
				make_ans(i-1);
			}

90도 180도 270도로 총 3번의 rotation 메소드를 돌리고,


	private static void rotation(int count) {
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) arr[j][(N-1)-i] = temp[i][j];
		}
		
		if(count==3) return;
		copy();
	} // End of rotation

rotation 메소드는 그냥 temp의 배열의 가로값을 arr의 세로에 복사하기 만하면 간단하게 해결

copy메소드는 처음에 복사된걸 감안해서 뒤에다 넣어주었고, copy가 마지막에 실행되지 않도록 하기 위해서 count 메소드를 통해 불필요한 실행을 방지했다.


	private static void make_ans(int ansCount) {
		for(int i=0; i<N; i++) {
			StringBuilder temp = new StringBuilder();
			for(int j=0; j<N; j++) temp.append(arr[i][j]);
			ans[i][ansCount] = temp.toString();
		}
	} // End of make_ans
	
	private static void result_build() {
		for(int i=0; i<N; i++) {
			for(int j=0; j<3; j++) sb.append(ans[i][j]).append(' ');
			sb.append('\n');
		}
	} // End of result_build

make_ans와 result_build 는 결과를 만들어내는 메소드인데, make_ans에서는 rotation을 한번 실행한 회전한 배열을 출력하기위해 ans로 복사하고, result_build는 모두 회전이 끝난후 sb에 넣기 위한 ans 출력 메소드이다.



코드



Java

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

public class Solution {
	static StringBuilder sb = new StringBuilder();
	static int arr[][];
	static int temp[][];
	static String ans[][];
	static int N;
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int T = Integer.parseInt(br.readLine());
		for(int t=1; t<=T; t++) {
			sb.append("#").append(t).append('\n');
			N = Integer.parseInt(br.readLine());
			
			arr = new int[N][N];
			temp = new int[N][N];
			ans = new String[N][3];
			for(int i=0; i<N; i++) {
				StringTokenizer st = new StringTokenizer(br.readLine());
				for(int j=0; j<N; j++) temp[i][j] = arr[i][j] = Integer.parseInt(st.nextToken());
			}
			
			for(int i=1; i<=3; i++) {
				rotation(i); // 90도 단위로 회전, 90, 180, 270 총 3번 회전
				make_ans(i-1);
			}
			
			result_build();			
		} // End of for(t)
		
		bw.write(sb.toString()); bw.flush(); bw.close();
	} // End of main

	private static void rotation(int count) {
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) arr[j][(N-1)-i] = temp[i][j];
		}
		
		if(count==3) return;
		copy();
	} // End of rotation
	
	private static void copy() {
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) temp[i][j] = arr[i][j];
		}
	} // End of copy
	
	private static void make_ans(int ansCount) {
		for(int i=0; i<N; i++) {
			StringBuilder temp = new StringBuilder();
			for(int j=0; j<N; j++) temp.append(arr[i][j]);
			ans[i][ansCount] = temp.toString();
		}
	} // End of make_ans
	
	private static void result_build() {
		for(int i=0; i<N; i++) {
			for(int j=0; j<3; j++) sb.append(ans[i][j]).append(' ');
			sb.append('\n');
		}
	} // End of result_build
} // End of Main class


Kotlin

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

private val sb = StringBuilder()
private var N = 0
private lateinit var arr : Array<IntArray>
private lateinit var temp : Array<IntArray>
private lateinit var ans : Array<Array<String>>

fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val bw = BufferedWriter(OutputStreamWriter(System.`out`))

    var T = br.readLine().toInt()
    for(t in 1..T) {
        sb.append('#').append(t).append('\n')
        N  = br.readLine().toInt()

        arr = Array(N){IntArray(N)}
        temp = Array(N){IntArray(N)}
        ans = Array(N){Array(3){""}}

        for(i in 0 until N) {
            var st = StringTokenizer(br.readLine())
            for(j in 0 until N) {
                val num = st.nextToken().toInt()
                arr[i][j] = num; temp[i][j] = num
            }
        }

        for(i in 1..3) {
            rotation(i)
            make_ans(i-1)
        }
        result_build()
    }

    bw.write(sb.toString()); bw.flush(); bw.close()
} // End of main

private fun rotation(count : Int) {
    for(i in 0 until N) {
        for(j in 0 until N) arr[j][(N-1)-i] = temp[i][j]
    }
    if(count.equals(3)) return
    copy()
} // End of rotation

private fun copy() {
    for(i in 0 until N) {
        for(j in 0 until N) temp[i][j] = arr[i][j]
    }
} // End of copy

private fun make_ans(ansCount : Int) {
    for (i in 0 until N) {
        val temp = StringBuilder()
        for (j in 0 until N) temp.append(arr[i][j])
        ans[i][ansCount] = temp.toString()
    }
} // End of make_ans

private fun result_build() {
    for(i in 0 until N) {
        for(j in 0 until 3) sb.append(ans[i][j]).append(' ')
        sb.append('\n')
    }
} // End of result_build

0개의 댓글