728x90
반응형
★ 핵심 : 격자 안에서의 완전탐색
1. 유형 : 모든 경우의 수 판단
2. 시간복잡도 계산 필수 : 보편적으로 시간복잡도가 1억이 넘어가면 시간초과날 확률이 높다.
문제링크
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
핵심
1. 2가지 블록의 총 경우의 수 : 6가지( ㅡ모양, ㅣ모양, ㄱ모양, 반대ㄱ모양, ㄴ모양, 반대 ㄴ 모양)

2. 반대모양 구할 때 모양을 돌리지 말고 점수판자체를 반대로 하는 것이 훨씬 편리하다.
board = [list(map(int, input().split())) for _ in range(n)]
reverse_borad = [row[::-1] for row in board]
코드(Python)
# 시간복잡도
# O(N * M)
n, m = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
reverse_borad = [row[::-1] for row in board]
# ㅡ 모양
def f1_1(n, m, board):
sum_val = 0
for r in range(n):
for c in range(m - 3 + 1):
sum_val = max(sum_val, board[r][c] + board[r][c + 1] + board[r][c + 2])
return sum_val
res1_1 = f1_1(n, m, board)
# ㅣ 모양
def f1_2(n, m, board):
sum_val = 0
for r in range(n - 3 + 1):
for c in range(m):
sum_val = max(sum_val, board[r][c] + board[r + 1][c] + board[r + 2][c])
return sum_val
res1_2 = f1_2(n, m, board)
# ㄴ 모양
def f2_1(n, m, board):
sum_val = 0
for r in range(n - 2 + 1):
for c in range(m - 2 + 1):
sum_val = max(sum_val, board[r][c] + board[r + 1][c] + board[r + 1][c + 1])
return sum_val
res2_1 = f2_1(n, m, board)
res2_1_R = f2_1(n, m, reverse_borad)
# ㄱ 모양
def f2_2(n, m, board):
sum_val = 0
for r in range(n - 2 + 1):
for c in range(m - 2 + 1):
sum_val = max(sum_val, board[r][c] + board[r][c + 1] + board[r + 1][c + 1])
return sum_val
res2_2 = f2_2(n, m, board)
res2_2_R = f2_2(n, m, reverse_borad)
print(max(res1_1, res1_2, res2_1, res2_1_R, res2_2, res2_2_R))
코드(Java)
import java.io.*;
import java.util.*;
public class Main {
public static int n, m, sum_val, MAX_N = 200, MAX_M = 200;
public static int[][] board = new int[MAX_N][MAX_M];
public static int[][] reverseBoard = new int[MAX_N][MAX_M];
// - 모양
public static int f1_1(int n, int m, int[][]board){
sum_val = 0;
for(int r = 0; r < n; r++){
for(int c = 0; c < m - 3 + 1; c++){
sum_val = Math.max(sum_val, board[r][c] + board[r][c + 1] + board[r][c + 2]);
}
}
return sum_val;
}
// l 모양
public static int f1_2(int n, int m, int[][]board){
sum_val = 0;
for(int r = 0; r < n - 3 + 1; r++){
for(int c = 0; c < m; c++ ){
sum_val = Math.max(sum_val, board[r][c] + board[r + 1][c] + board[r + 2][c]);
}
}
return sum_val;
}
//ㄴ모양
public static int f2_1(int n, int m, int[][]board){
sum_val = 0;
for(int r = 0; r < n - 2 + 1; r++){
for(int c = 0; c < m - 2 + 1; c++ ){
sum_val = Math.max(sum_val, board[r][c] + board[r + 1][c] + board[r + 1][c + 1]);
}
}
return sum_val;
}
// ㄱ모양
public static int f2_2(int n, int m, int[][]board){
sum_val = 0;
for(int r = 0; r < n - 2 + 1; r++){
for(int c = 0; c < m - 2 + 1; c++ ){
sum_val = Math.max(sum_val, board[r][c] + board[r][c + 1] + board[r + 1][c + 1]);
}
}
return sum_val;
}
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());
for(int i = 0; i < n; i++){
st = new StringTokenizer(br.readLine());
for(int j = 0; j < m; j++){
String k = st.nextToken();
board[i][j] = Integer.parseInt(k);
reverseBoard[i][m - j - 1] = Integer.parseInt(k);
}
}
int[] results = new int[6];
results[0] = f1_1(n, m, board);
results[1] = f1_2(n, m, board);
results[2] = f2_1(n, m, board);
results[3] = f2_1(n, m, reverseBoard);
results[4] = f2_2(n, m, board);
results[5] = f2_2(n, m, reverseBoard);
int maxResult = 0;
for (int result : results) {
maxResult = Math.max(maxResult, result);
}
System.out.print(maxResult);
}
}
◎관련문제
※ 실력진단
728x90
반응형
'PS > 코드트리' 카테고리의 다른 글
[코드트리 챌린지] 3주차 - 양수 직사각형의 최대 크기 (0) | 2023.09.20 |
---|---|
[코드트리 챌린지] 2주차 - 금 채굴하기 (0) | 2023.09.20 |
[코드트리 챌린지] 1주차 - 최고의 33위치 (0) | 2023.09.11 |
[코드트리 챌린지] 1주차 - 거울에 레이저 쏘기 2(Python) (0) | 2023.09.10 |
[코드트리 챌린지] 1주차 - 빙빙 돌며 사각형 채우기(Java) (0) | 2023.09.08 |