[백준] 16926 - 배열 돌리기 1
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