티스토리 뷰
[ 백준 17406 ] 배열 돌리기 4 ( java )
출처: 백준 코딩 테스트 연습, https://www.acmicpc.net/problem/17406
핵심
1 dfs를 이용한 회전 순서 설정
전형적인 dfs 방식으로 orders 배열에 순서를 저장한다.
orders[i]: i 번째로 회전할 회전 번호
2 회전
하나의 순서가 완성되면, 문제에서 주어진 대로 회전시키면 된다.
( y-x, x-s ) 값을 따로 빼두고, 왼쪽, 아래, 오른쪽, 위쪽 변 순서대로 한 칸씩 시계방향으로 이동시킨다.
마지막으로 따로 빼둔 값을 ( y-x, x-s+1) 로 옮기면 된다.
코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
map = new int[N+1][M+1];
copy = 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());
}
}
rots = new int[K][3];
selected = new boolean[K];
orders = new int[K];
int y, x, s;
for(int i = 0 ; i < K ; i++) {
st = new StringTokenizer(br.readLine());
y = Integer.parseInt(st.nextToken());
x = Integer.parseInt(st.nextToken());
s = Integer.parseInt(st.nextToken());
rots[i][0] = y;
rots[i][1] = x;
rots[i][2] = s;
}
dfs(0);
System.out.println(min);
}
static int N, M, K;
static int[][] map, copy;
static int[][] rots; // rots[i][3] i번호 회전에 대한 정보
static int[] orders; // orders[i]: i번째로 회전할 회전의 번호
static boolean[] selected;
static int min = Integer.MAX_VALUE;
static void dfs(int oi) {
if(oi == K) {
for(int i = 1 ; i <= N ; i++) {
for(int j = 1 ; j<= M; j++) {
copy[i][j] = map[i][j];
}
}
int y, x, s;
for(int oi2 = 0 ; oi2 < K; oi2++) {
y = rots[orders[oi2]][0];
x = rots[orders[oi2]][1];
s = rots[orders[oi2]][2];
rotate(y, x, s);
}
int sum;
for( y = 1 ; y <= N ; y++) {
sum = 0;
for( x = 1 ; x <= M; x++) {
sum += copy[y][x];
}
if(min > sum)
min = sum;
}
return;
}
for(int num = 0 ; num < K ; num++) {
if(!selected[num]) {
selected[num] = true;
orders[oi] = num;
dfs(oi+1);
selected[num] = false;
}
}
}
static void rotate(int oy, int ox, int os) {
int sy, sx, ey, ex, start ;
for(int s = os ; s >= 1; s-- ) {
sy = oy - s;
sx = ox - s;
ey = oy + s;
ex = ox + s;
start = copy[sy][sx];
for(int y = sy+1 ; y <= ey ; y++) {
copy[y-1][sx] = copy[y][sx];
}
for(int x = sx+1 ; x <= ex ; x++) {
copy[ey][x-1] = copy[ey][x];
}
for(int y = ey-1; y >= sy ; y--) {
copy[y+1][ex] = copy[y][ex];
}
for(int x = ex -1 ; x >= sx+1 ; x--) {
copy[sy][x+1] = copy[sy][x];
}
copy[sy][sx+1] = start;
}
}
}
|
cs |
'CS > 알고리즘 풀이' 카테고리의 다른 글
[ 백준 12100 ] 2048 Easy ( 자바 ) (0) | 2020.02.18 |
---|---|
[ 백준 14502 ] 연구소 ( 자바 ) (0) | 2020.02.17 |
[ 백준 17136 ] 색종이 붙이기 ( 자바 ) (0) | 2020.02.17 |
[ 백준 17135 ] 캐슬 디펜스 ( 자바 ) (0) | 2020.02.16 |
[ 백준 17070 ] 파이프 옮기기 1 ( 자바 ) (0) | 2020.02.12 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 괄호 변환
- 게리맨더링 2
- 찾아라 프로그래밍 마에스터
- Brainf**k 인터프리터
- 오블완
- 124 나라의 숫자
- 큰 수 만들기
- 티스토리챌린지
- 후보키
- 정수 내림차순으로 배치하기
- 가장 큰 정사각형 찾기
- 주사위 윷놀이
- DP
- java
- 2019 카카오 공채
- 17779
- 백준
- 3954
- 자바
- 문자열을 정수로 바꾸기
- 프로그래머스
- 단체사진 찍기
- 17825
- 투포인터
- 라면공장
- 카카오 2020 공채
- 2018 카카오 공채
- programmers
- 짝지어 제거하기
- 카카오2020 공채
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함