1. 문제

16926번: 배열 돌리기 1



2. 개요

N x M크기의 배열을 반시계 방향으로 R만큼 회전시킨 결과를 구하는 문제.



3. 풀이 및 코드

3-1. 풀이

N x M크기의 배열을 회전시키고 안의 N - 1 x M - 1 배열을 회전시키고, 다시 N - 2 x M - 2 배열을 회전시키고 … 를 반복하면 된다.

3-2. Python

import sys

N, M, R = map(int, sys.stdin.readline().split())

board = []

for i in range(N):
    board.append(list(map(int, sys.stdin.readline().split())))

limit = min(N, M) // 2
cnt = 0

while cnt < R:
    for i in range(0, limit):
        tmp = board[i][i]

        for j in range(i, M - i - 1):
            board[i][j] = board[i][j+1]

        for j in range(i, N - i - 1):
            board[j][M - i - 1] = board[j+1][M - i - 1]

        for j in range(M - i - 1, i, -1):
            board[N - i - 1][j] = board[N - i - 1][j-1]

        for j in range(N - i - 1, i, -1):
            board[j][i] = board[j-1][i]

        board[i+1][i] = tmp

    cnt += 1

for r in board:
    print(*r)

3-3. C#

namespace boj_16926
{
    internal class Program
    {
        static void Main(string[] args)
        {
            StreamReader sr = new StreamReader(Console.OpenStandardInput());
            StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());

            string[] input = sr.ReadLine().Split();
            int N = int.Parse(input[0]), M = int.Parse(input[1]), R = int.Parse(input[2]);

            int[,] board = new int[N, M];

            for (int i = 0; i < N; i++)
            {
                string[] row = sr.ReadLine().Split();
                for (int j = 0; j < M; j++)
                {
                    board[i, j] = int.Parse(row[j]);
                }
            }

            int limit = (int)(MathF.Min(N, M) / 2);
            int cnt = 0;

            while (cnt < R)
            {
                for (int i = 0; i < limit; i++)
                {
                    int tmp = board[i, i];

                    for (int j = i; j < M - i - 1; j++)
                        board[i, j] = board[i, j + 1];

                    for (int j = i; j < N - i - 1; j++)
                        board[j, M - i - 1] = board[j + 1, M - i - 1];

                    for (int j = M - i - 1; j > i; j--)
                        board[N - i - 1, j] = board[N - i - 1, j - 1];

                    for (int j = N - i - 1; j > i; j--)
                        board[j, i] = board[j - 1, i];

                    board[i + 1, i] = tmp;
                }

                cnt++;
            }

            int writecnt = 1;
            foreach (int num in board)
            {
                if (writecnt == M)
                {
                    sw.Write(num);
                    sw.WriteLine();
                    writecnt = 0;
                }
                    

                else
                    sw.Write($"{num} ");

                writecnt++;
            }

            sw.Close();
        }
    }
}

Comments