https://www.acmicpc.net/problem/16926
제한사항:
- O(N*M*R) = 300 * 300 * 1000 * min(N,M)/2
- min(N,M) mod 2 = 0 : N,M중 작은 값은 2의 배수
<풀이>
- 배열을 시계 방향으로 돌려야함 - 바깥쪽부터 안쪽으로 돌아가면서 돌리도록 작성
- 바깥쪽에서 몇번째 줄인지 확인하기 위해 변수 count 사용. 안으로 들어갈때마다 1개씩 늘려주며 index 잘 만들어줌
- 주의할 점은 println으로 할 경우 시간이 많이 걸리는데 StringBuilder를 쓰자 반으로 줄었다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_16926 {
static int N,M,R;
static int map[][], after[][];
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder("");
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
R = Integer.parseInt(st.nextToken());
map = new int [N+1][M+1]; //인덱스 1부터 시작하도록
after = new int [N+1][M+1];
for(int i=1;i<=N;i++) {
st = new StringTokenizer(br.readLine());
for(int j=1;j<=M;j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}//-입력 끝
rotate(R); // count: 바깥에서부터 몇번째 줄 할 차례인지
for(int i=1;i<=N;i++) {
for(int j=1;j<=M;j++) {
// System.out.print(map[i][j]+ " ");
sb.append(map[i][j]).append(" ");
}
// System.out.println();
sb.append("\n");
}
System.out.println(sb.toString());
}
public static void rotate(int R) {
if(R==0) return;
int count = 1;
while(true) {
if(count >(M/2) || count > (N/2)) {//count가 N,M길이의 반을 넘어가면 돌릴 이유 X->종료
break;
}
for(int i=count;i<M+1-count;i++) {
after[count][i] = map[count][i+1];//위
after[N+1-count][i+1] = map[N+1-count][i];//아래
}
for(int i=count;i<N+1-count;i++) {
after[i+1][count] = map[i][count];//왼쪽
after[i][M+1-count] = map[i+1][M+1-count];//오른쪽
}
count++;
}
for(int i=1;i<=N;i++) {
for(int j=1;j<=M;j++) {
map[i][j] = after[i][j];
}
}
rotate(--R);
}
}
https://github.com/LeeJieuni/Algorithm/blob/main/BOJ/Main_16926_%EC%9D%B4%EC%A7%80%EC%9D%80.java
'공부 > 알고리즘' 카테고리의 다른 글
[백준]2563_색종이_Java 풀이 (0) | 2022.02.11 |
---|---|
[백준]4963_섬의 개수_Java 풀이 (0) | 2022.02.09 |
[백준]2309_일곱난쟁이_Java 풀이 (0) | 2022.02.09 |
[SWEA]3499_퍼펙트 셔플_Java 풀이 (0) | 2022.02.09 |
[백준]1260_DFS와 BFS_JAVA 풀이 (0) | 2022.02.08 |
댓글