알고리즘/문제풀이

[브루트포스] 테트로미노

lipnus 2019. 3. 26. 22:41
반응형

백준 14500 테트로미노 (삼성 SW역량테스트 기출)

https://www.acmicpc.net/problem/14500



import java.util.Scanner;

public class Main {

static int N;
static int M;
static int[][] map;

static int maxVal =0;

public static void main(String[] args){

Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();

map = new int[N+1][M+1];

for(int i=1; i<=N; i++){
for(int j=1; j<=M; j++){
map[i][j] = sc.nextInt();
}
}

type1();

type2();

System.out.println(maxVal);


}

static void type1(){

//가로로 4칸
for(int i=1; i<=N; i++){
for(int j=1; j<=M-3; j++){
int sum = map[i][j] + map[i][j+1] + map[i][j+2] + map[i][j+3];
maxVal = Math.max(maxVal, sum);
}
}

//세로로 4칸
for(int i=1; i<=N-3; i++){
for(int j=1; j<=M; j++){
int sum = map[i][j] + map[i+1][j] + map[i+2][j] + map[i+3][j];
maxVal = Math.max(maxVal, sum);
}
}
}



static void type2(){

//3x2(가로)
for(int i=1; i<=N-1; i++){
for(int j=1; j<=M-2; j++){

int sum = map[i][j] + map[i][j+1] + map[i][j+2] + map[i+1][j] + map[i+1][j+1] + map[i+1][j+2];

cal(sum, map[i][j], map[i+1][j]);
cal(sum, map[i][j+2], map[i+1][j+2]);

cal(sum, map[i][j+1], map[i][j+2]);
cal(sum, map[i][j], map[i][j+1]);
cal(sum, map[i+1][j], map[i+1][j+1]);
cal(sum, map[i+1][j+1], map[i+1][j+2]);

cal(sum, map[i][j+2], map[i+1][j]);
cal(sum, map[i][j], map[i+1][j+2]);

cal(sum, map[i][j], map[i][j+2]);
cal(sum, map[i+1][j], map[i+1][j+2]);
}
}

//2x3(세로)
for(int i=1; i<=N-2; i++){
for(int j=1; j<=M-1; j++){

int sum = map[i][j] + map[i+1][j] + map[i+2][j] + map[i][j+1] + map[i+1][j+1] + map[i+2][j+1];

//4칸 뚱땡이는 위에서 모두 체크되어서 안해도 괜찮음

cal(sum, map[i][j], map[i+1][j]);
cal(sum, map[i+1][j], map[i+2][j]);
cal(sum, map[i][j+1], map[i+1][j+1]);
cal(sum, map[i+1][j+1], map[i+2][j+1]);

cal(sum, map[i][j], map[i+2][j+1]);
cal(sum, map[i][j+1], map[i+2][j]);

cal(sum, map[i][j], map[i+2][j]);
cal(sum, map[i][j+1], map[i+2][j+1]);
}
}


}

static void cal(int sum, int remove1, int remove2){
int value = sum - remove1 - remove2;
maxVal = Math.max(maxVal, value);
}
}



크게 두가지로 나눈다.

각각 가로, 세로 2가지 경우가 있다.


type1 (1x4)


type2 (2x3)



type2는 6칸을 더한 값에서 2칸을 뺀다.










세속적인 욕심과 번뇌를 버리고 정갈한 마음으로 차분하게 풀면 된다.


반응형

'알고리즘 > 문제풀이' 카테고리의 다른 글

[시뮬레이션] 로봇청소기  (0) 2019.03.31
[시뮬레이션] 연구실  (0) 2019.03.30
[시뮬레이션] 주사위 굴리기  (0) 2019.03.26
시험감독  (0) 2019.03.25
[시뮬레이션] 뱀  (0) 2019.03.25