티스토리 뷰
블록 모양별 case를 나눠 brute force
풀이
범위 실수만 안하면 무난하게 풀 수 있는 문제이다.
반복되는 부분을 줄이고 싶어서 아래처럼 공통되는 부분을 찾고 method화 하였다.
그리고 블록이 범위를 벗어나는 부분을 간편하게 처리하기 위해 이차원 배열 크기를 처음부터 넉넉히 설정하였다.
계속 틀렸습니다가 뜬다면 아래의 반례를 참고하도록 하자.
Logic
- 2중 for문을 돌면서 해당 범위 내의 최댓값을 찾는다.
- 답을 출력한다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int N, M, ans;
static int[][] map;
public static void main(String[] args) throws IOException {
input();
solve();
System.out.println(ans);
}
public static void input() 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());
map = new int[N + 4][M + 4];
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());
}
br.close();
}
public static void solve() {
for (int i = 1; i <= N - 1; i++) {
for (int j = 1; j <= M; j++) {
int temp = Math.max(R3C1(i, j), R2C1(i, j));
ans = Math.max(ans, temp);
}
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M - 1; j++) {
int temp = Math.max(R1C3(i, j), R1C2(i, j));
ans = Math.max(ans, temp);
}
}
}
public static int R3C1(int x, int y) {
int base = map[x][y] + map[x + 1][y] + map[x + 2][y];
int maxValue = 0;
for (int i = 0; i < 3; i++) {
maxValue = Math.max(maxValue, base + map[x + i][y - 1]);
maxValue = Math.max(maxValue, base + map[x + i][y + 1]);
}
maxValue = Math.max(maxValue, base + map[x + 3][y]);
return maxValue;
}
public static int R2C1(int x, int y) {
int base = map[x][y] + map[x + 1][y];
int maxValue = 0;
int[] val = { map[x][y + 1] + map[x + 1][y + 1],
map[x + 1][y + 1] + map[x + 2][y + 1],
map[x + 2][y] + map[x + 3][y],
map[x + 1][y - 1] + map[x + 2][y - 1] };
for (int i = 0; i < val.length; i++)
maxValue = Math.max(maxValue, base + val[i]);
return maxValue;
}
public static int R1C3(int x, int y) {
int base = map[x][y] + map[x][y + 1] + map[x][y + 2];
int maxValue = 0;
for (int j = 0; j < 3; j++) {
maxValue = Math.max(maxValue, base + map[x - 1][y + j]);
maxValue = Math.max(maxValue, base + map[x + 1][y + j]);
}
maxValue = Math.max(maxValue, base + map[x][y + 3]);
return maxValue;
}
public static int R1C2(int x, int y) {
int base = map[x][y] + map[x][y + 1];
int maxValue = 0;
int[] val = { map[x + 1][y - 1] + map[x + 1][y], map[x + 1][y + 1] + map[x + 1][y + 2] };
for (int i = 0; i < val.length; i++)
maxValue = Math.max(maxValue, base + val[i]);
return maxValue;
}
}
'알고리즘' 카테고리의 다른 글
[백준] 16234. 인구이동 (Java) (0) | 2021.01.13 |
---|---|
[백준] 17413. 단어 뒤집기2 (Java) (0) | 2021.01.03 |
[백준] 2290. LCDTest (Java) (1) | 2020.12.23 |
[백준] 2933. 미네랄 (0) | 2020.12.20 |
[백준] 15662. 톱니바퀴2 (Java) (0) | 2020.12.20 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- regex
- 그래프
- form
- 알고리즘
- 시뮬레이션
- 삼성역테기출
- vue.js
- web
- 벨만포드
- 우선순위큐
- 프로그래머스
- 정규식
- 다익스트라
- 이분탐색
- dp
- swea
- BigInteger
- 구현
- 해시
- 브루트포스
- Validation
- 문자열
- REACT
- matches
- java
- CustomHook
- 백트래킹
- 백준
- BFS
- dfs
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함