일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 스포티파이
- python
- linux
- c
- java
- SECS/GEM
- programmers
- 백준
- spotify
- 회원가입
- Spotify Api
- C++
- 자바
- Baekjoon
- modern c++
- Spring
- SW Expert Academy
- regression
- 회귀
- 파이썬
- MYSQL
- Gem
- SECS-II
- Spring JPA
- CS
- 프로그래머스
- Computer Science
- spring boot
- SECS
- SWEA
Archives
- Today
- Total
비버놀로지
[BAEKJOON 백준] 17406 배열돌리기 4 본문
728x90
https://www.acmicpc.net/problem/17406
배열과 좌표를 이용해서 배열을 돌리는 문제입니다.
그리고 좌표는 수열을 통해서 나열을 해야하고, 그렇게 나열한 배열을 돌려서 얻은 배열을 통해 답을 찾는다.
import java.util.Scanner;
public class Main {
static class Point { // 회전할 좌표와 횟수 저장할 클래스
int x, y, z;
public Point(int x, int y, int z) {
super();
this.x = x;
this.y = y;
this.z = z;
}
}
static boolean visit[];
static int K, N, M;
static Point cal[];
static int arr[][];
static int temparr[][]; // 복사한 배열하나 만들기
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
K = sc.nextInt();
temp = new Point[K];
visit = new boolean[K];
cal = new Point[K];
arr = new int[N + 1][M + 1];
temparr = new int[N + 1][M + 1];
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
arr[i][j] = sc.nextInt();
}
}
for (int i = 0; i < K; i++) {
cal[i] = new Point(sc.nextInt(), sc.nextInt(), sc.nextInt());
}
solve(0);
System.out.println(answer);
}
static Point temp[];
static int answer = Integer.MAX_VALUE;
private static void solve(int cnt) { // 순열을 이용해서 좌표를 나열
// TODO Auto-generated method stub
if (cnt == K) { // 순열로 나열된 좌표를 통해서 회전시키기
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
temparr[i][j] = arr[i][j]; // 배열 복사하기
}
}
rotate(temp); // 회전시키기
for (int i = 1; i <= N; i++) { // 회전시킨 배열을 이용해서 답찾기
int result = 0;
for (int j = 1; j <= M; j++) {
result += temparr[i][j];
}
if (answer > result) { // 최소값을 찾는다.
answer = result;
}
}
return;
}
for (int i = 0; i < K; i++) { // 수열로 나열하기
if (visit[i])
continue;
temp[cnt] = cal[i];
visit[i] = true;
solve(cnt + 1);
visit[i] = false;
}
}
private static void rotate(Point[] temp) { // 회전시키기
// TODO Auto-generated method stub
for (int k = 0; k < K; k++) { // 좌표의 개수
Point p = temp[k];
for (int i = 1; i <= p.z; i++) { // 회전할 배열량
int ptype = -1;
for (int y = p.y - i; y <= p.y + i; y++) { // 위쪽
if (ptype == -1) {
ptype = temparr[p.x - i][y];
} else {
int temp1 = ptype;
ptype = temparr[p.x - i][y];
temparr[p.x - i][y] = temp1;
}
}
for (int x = p.x - i + 1; x <= p.x + i; x++) { // 오른쪽
int temp1 = ptype;
ptype = temparr[x][p.y + i];
temparr[x][p.y + i] = temp1;
}
for (int y = p.y + i - 1; y >= p.y - i; y--) { // 왼쪽
int temp1 = ptype;
ptype = temparr[p.x + i][y];
temparr[p.x + i][y] = temp1;
}
for (int x = p.x + i - 1; x >= p.x - i; x--) { // 아래쪽
int temp1 = ptype;
ptype = temparr[x][p.y - i];
temparr[x][p.y - i] = temp1;
}
}
}
}
}
728x90
'ALGORITM > JAVA' 카테고리의 다른 글
[SWEA SW Expert Academy] 1249 보급로 (0) | 2020.12.01 |
---|---|
[SWEA SW Expert Academy] 4013 특이한 자석 (0) | 2020.12.01 |
[BAEKJOON 백준] 1992 쿼드트리 (0) | 2020.08.30 |
[BAEKJOON 백준] 15686 치킨 배달 (0) | 2020.08.30 |
[BAEKJOON 백준] 1074 Z (0) | 2020.08.30 |
Comments