[알고리즘] 배열 돌리기 1

2024. 2. 6. 15:14알고리즘 풀이/Java

https://www.acmicpc.net/problem/16926

 

16926번: 배열 돌리기 1

크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]

www.acmicpc.net

package boj.solution16926;

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

public class Main {
	
	static StringBuilder sb = new StringBuilder();
	static class Position {
		int x;
		int y;
		public Position(int x, int y) {
			super();
			this.x = x;
			this.y = y;
		}
		
		
	}
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		int R = Integer.parseInt(st.nextToken());
		
		int[][] numbers = new int[N][M];
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < M; j++) {
				numbers[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		int[][] newNumbers = new int[N][M];
		
		int count = 0;
		int n = N;
		int m = M;
		while (n >= 1 && m >= 1) {
			rotateGraph(numbers, newNumbers, n, m, R, count);
			n-=2;
			m-=2;
			count++;
		}
		
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				sb.append(newNumbers[i][j]).append(" ");
			}
			sb.append("\n");
		}
		System.out.println(sb);
	}
	
	private static void rotateGraph(int[][] numbers, int[][] newNumbers, int n, int m, int R, int count) {
		List<Position> positions = iterateGraph(new Position(count, count), n-1, m-1);
		int index = (positions.size() - (R % positions.size()));
		for (Position position : positions) {
			Position position2 = positions.get(index++ % positions.size());
			newNumbers[position.x][position.y] = numbers[position2.x][position2.y];
		}
	}
	
	private static List<Position> iterateGraph(Position position, int n, int m) {
		List<Position> result = new ArrayList<>();
		int nx = position.x;
		int ny = position.y;
		
		result.add(new Position(nx, ny));
		for (int i = 0; i < n; i++) {
			nx += 1;
			result.add(new Position(nx, ny));
		}
		for (int i = 0; i < m; i++) {
			ny += 1;
			result.add(new Position(nx, ny));
		}
		for (int i = 0; i < n; i++) {
			nx -= 1;
			result.add(new Position(nx, ny));
		}
		for (int i = 0; i < m - 1; i++) {
			ny -= 1;
			result.add(new Position(nx, ny));
		}
		
		return result;
	}
}

나의 풀이

- 인덱스를 활용하여 풀었다.

'알고리즘 풀이 > Java' 카테고리의 다른 글

[알고리즘][X] 색종이  (1) 2024.02.06
[알고리즘] 큐  (0) 2024.02.06
[알고리즘] 트리 정리  (0) 2024.02.06
[알고리즘][X] AC  (1) 2024.02.06
[알고리즘] 요세푸스 문제  (0) 2024.02.05