반응형

풀이
- 해당 문제는 어떻게 푸는 방법이 좋을지 고민했을 때
- 각 도형에 따른 변형을 최소화하면서, 기준 좌표로부터
- 이동가능한 좌표 탐색을 4방향을 우선적으로 작성 후 값을 도출하는 것이 좋을 것 같다고 판단.
- 다만, 이러한 노가다가 과연 적절한지 고민해봤는데 나쁘지 않을 듯해서 아래와 같이 작성
- 그리고 무슨 5중 for문으로 해결한 문제는 이번이 처음인듯...
- 그래도 최대한 코드를 가독성 좋으며, 구조적으로 작성하려고 노력하여 아래와 같이 작성.
- 문제 자체는 크게 어려운 건 아니지만, 번거로웠다? 정도였음.
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class _14500 {
static BufferedReader br;
static StringTokenizer st;
static int[][][][] li;
static int[][] mtx;
static int N;
static int M;
static int result = 0;
public static void main(String[] args) throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
li = new int[5][][][];
addDefault();
findTetro();
System.out.println(result);
}
private static void addDefault() throws IOException {
li[0] = new int[][][] {
{{0, 0}, {0, 1}, {0, 2}, {0, 3}},
{{0, 0}, {1, 0}, {2, 0}, {3, 0}}
};
li[1] = new int[][][] {
{{0, 0}, {0, 1}, {1, 1}, {1, 0}}
};
li[2] = new int[][][] {
{{0, -1}, {0, 0}, {0, 1}, {1, 0}},
{{0, -1}, {0, 0}, {-1, 0}, {1, 0}},
{{0, -1}, {0, 0}, {-1, 0}, {0, 1}},
{{-1, 0}, {0, 0}, {0, 1}, {1, 0}}
};
li[3] = new int[][][] {
{{0, 0}, {1, 0}, {1, 1}, {2, 1}},
{{0, 0}, {1, 0}, {1, -1}, {2, -1}},
{{0, 0}, {0, 1}, {-1, 1}, {-1, 2}},
{{0, 0}, {0, 1}, {1, 1}, {1, 2}}
};
li[4] = new int[][][] {
{{0, 0}, {1, 0}, {2, 0}, {2, 1}},
{{0, 0}, {1, 0}, {2, 0}, {2, -1}},
{{0, 0}, {1, 0}, {0, 1}, {0, 2}},
{{0, 0}, {1, 0}, {0, -1}, {0, -2}},
{{0, 0}, {0, 1}, {1, 1}, {2, 1}},
{{0, 0}, {0, -1}, {1, -1}, {2, -1}},
{{0, 0}, {-1, 0}, {0, -1}, {0, -2}},
{{0, 0}, {-1, 0}, {0, 1}, {0, 2}}
};
mtx = new int[N][M];
for (int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
for (int j=0; j<M; j++) mtx[i][j] = Integer.parseInt(st.nextToken());
}
}
private static void findTetro() {
for (int i=0; i<N; i++) {
for (int j=0; j<M; j++) {
detailTetro(i,j);
}
}
}
private static void detailTetro(int i, int j) {
for (int t=0; t<5; t++) { // 각 도형
for (int x=0; x<li[t].length; x++) { // 도형 별 회전&대칭
boolean state = true;
int hap = 0;
for (int y=0; y<4; y++) {
if ((0<=i+li[t][x][y][0]&&i+li[t][x][y][0]<N)&&(0<=j+li[t][x][y][1]&&j+li[t][x][y][1]<M)) hap+=mtx[i+li[t][x][y][0]][j+li[t][x][y][1]];
else {
state = false;
break;
}
}
if (state&&hap>result) result = hap;
}
}
}
}

'알고리즘' 카테고리의 다른 글
[백준, 자바, 1551번] 수열의 변화 (1) | 2024.12.13 |
---|---|
[백준, 자바, 6064번] 카잉 달력 (0) | 2024.12.10 |
[백준, 자바, 5525번] IOIOI (0) | 2024.12.10 |
[백준, 자바, 1389번] 케빈 베이컨의 6단계 법칙 (1) | 2024.12.09 |
[백준, 자바, 30804번] 과일 탕후루 (0) | 2024.12.06 |