티스토리 뷰
블록 모양별 case를 나눠 brute force
14500번: 테트로미노
폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변
www.acmicpc.net
풀이
범위 실수만 안하면 무난하게 풀 수 있는 문제이다.
반복되는 부분을 줄이고 싶어서 아래처럼 공통되는 부분을 찾고 method화 하였다.
그리고 블록이 범위를 벗어나는 부분을 간편하게 처리하기 위해 이차원 배열 크기를 처음부터 넉넉히 설정하였다.
계속 틀렸습니다가 뜬다면 아래의 반례를 참고하도록 하자.
글 읽기 - 왜87%에서 틀렸습니다가뜰까요 ㅠ 도와줘요 코딩짱짱맨~~
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
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
- dfs
- BigInteger
- swea
- 이분탐색
- web
- 프로그래머스
- 알고리즘
- Validation
- regex
- 해시
- 삼성역테기출
- REACT
- form
- 벨만포드
- 시뮬레이션
- 브루트포스
- 그래프
- 우선순위큐
- 구현
- java
- 백트래킹
- 문자열
- CustomHook
- 다익스트라
- matches
- 백준
- BFS
- dp
- vue.js
- 정규식
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함