ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 14500 테트로미노
    Algorithm/구현(Brute force, Back tracking, etc.) 2021. 11. 9. 12:51
    728x90

    - 브루트포스 문제인데 정말 무식한 문제이다.. 다시는 풀기 싫은 문제

     

    - 시간복잡도는 O(NM)이다. 

     

    - 모든 가능한 블럭의 경우의 수를 먼저 생각하고, 이들이 주어진 범위에 어떻게 들어갈 수 있는지를 생각하면 된다. 꼼꼼하게 오류 없이 푸는게 중요한 것 같다.

    /* 모든 경우의 수를 다 고려한다 */
    #include <iostream>
    using namespace std;
    int a[500][500];
    int main() {
    	int n, m;
    	cin >> n >> m;
    	for (int i = 0; i<n; i++) {
    		for (int j = 0; j<m; j++) {
    			cin >> a[i][j];
    		}
    	}
    	int ans = 0;
    	for (int i = 0; i<n; i++) {
    		for (int j = 0; j<m; j++) {
    			if (j + 3 < m) { // 가로 막대기
    				int temp = a[i][j] + a[i][j + 1] + a[i][j + 2] + a[i][j + 3];
    				if (ans < temp) ans = temp;
    			}
    			if (i + 3 < n) { // 세로 막대기
    				int temp = a[i][j] + a[i + 1][j] + a[i + 2][j] + a[i + 3][j];
    				if (ans < temp) ans = temp;
    			}
    			if (i + 1 < n && j + 2 < m) { // ㄴ 가로로 긴 것
    				int temp = a[i][j] + a[i + 1][j] + a[i + 1][j + 1] + a[i + 1][j + 2];
    				if (ans < temp) ans = temp;
    			}
    			if (i + 2 < n && j + 1 < m) { // ㄱ 좌우 대칭해서 세로로 긴 것
    				int temp = a[i][j] + a[i][j + 1] + a[i + 1][j] + a[i + 2][j];
    				if (ans < temp) ans = temp;
    			}
    			if (i + 1 < n && j + 2 < m) {  //ㄱ 가로로 긴 것
    				int temp = a[i][j] + a[i][j + 1] + a[i][j + 2] + a[i + 1][j + 2];
    				if (ans < temp) ans = temp;
    			}
    			if (i + 2 < n && j - 1 >= 0) { // ㄴ 좌우 대칭해서 세로로 긴 것
    				int temp = a[i][j] + a[i + 1][j] + a[i + 2][j] + a[i + 2][j - 1];
    				if (ans < temp) ans = temp;
    			}
    			if (i - 1 >= 0 && j + 2 < m) {  // ㄴ 좌우 대칭해서 가로로 긴 것
    				int temp = a[i][j] + a[i][j + 1] + a[i][j + 2] + a[i - 1][j + 2];
    				if (ans < temp) ans = temp;
    			}
    			if (i + 2 < n && j + 1 < m) { // ㄴ 세로로 긴 것
    				int temp = a[i][j] + a[i + 1][j] + a[i + 2][j] + a[i + 2][j + 1];
    				if (ans < temp) ans = temp;
    			}
    			if (i + 1 < n && j + 2 < m) { // ㄱ 좌우 대칭해서 가로로 긴 것
    				int temp = a[i][j] + a[i][j + 1] + a[i][j + 2] + a[i + 1][j];
    				if (ans < temp) ans = temp;
    			}
    			if (i + 2 < n && j + 1 < m) { // ㄱ 세로로 긴 것
    				int temp = a[i][j] + a[i][j + 1] + a[i + 1][j + 1] + a[i + 2][j + 1];
    				if (ans < temp) ans = temp;
    			}
    			if (i + 1 < n && j + 1 < m) { // 네모
    				int temp = a[i][j] + a[i][j + 1] + a[i + 1][j] + a[i + 1][j + 1];
    				if (ans < temp) ans = temp;
    			}
    			if (i - 1 >= 0 && j + 2 < m) { // 번개 오른쪽 90도 회전
    				int temp = a[i][j] + a[i][j + 1] + a[i - 1][j + 1] + a[i - 1][j + 2];
    				if (ans < temp) ans = temp;
    			}
    			if (i + 2 < n && j + 1 < m) { // 번개
    				int temp = a[i][j] + a[i + 1][j] + a[i + 1][j + 1] + a[i + 2][j + 1];
    				if (ans < temp) ans = temp;
    			}
    			if (i + 1 < n && j + 2 < m) { // 번개 왼쪽 90도 회전
    				int temp = a[i][j] + a[i][j + 1] + a[i + 1][j + 1] + a[i + 1][j + 2];
    				if (ans < temp) ans = temp;
    			}
    			if (i + 2 < n && j - 1 >= 0) { // 번개 좌우 대칭
    				int temp = a[i][j] + a[i + 1][j] + a[i + 1][j - 1] + a[i + 2][j - 1];
    				if (ans < temp) ans = temp;
    			}
    			if (j + 2 < m) { 
    				int temp = a[i][j] + a[i][j + 1] + a[i][j + 2];
    				if (i - 1 >= 0) { // 가운데 중지 욕
    					int temp2 = temp + a[i - 1][j + 1];
    					if (ans < temp2) ans = temp2;
    				}
    				if (i + 1 < n) { // 가운데 중지 욕에서 중지 아래로
    					int temp2 = temp + a[i + 1][j + 1];
    					if (ans < temp2) ans = temp2;
    				}
    			}
    			if (i + 2 < n) { // 가운데 중지 욕 90도 회전
    				int temp = a[i][j] + a[i + 1][j] + a[i + 2][j];
    				if (j + 1 < m) {
    					int temp2 = temp + a[i + 1][j + 1];
    					if (ans < temp2) ans = temp2;
    				}
    				if (j - 1 >= 0) { // 가운데 중지 욕 왼쪽 회전
    					int temp2 = temp + a[i + 1][j - 1];
    					if (ans < temp2) ans = temp2;
    				}
    			}
    		}
    	}
    	cout << ans << '\n';
    	return 0;
    }

    'Algorithm > 구현(Brute force, Back tracking, etc.)' 카테고리의 다른 글

    백준 14503 로봇 청소기  (0) 2021.11.15
    백준 14501 퇴사  (0) 2021.11.11
    백준 14499 주사위 굴리기  (0) 2021.11.09
    백준 13458 시험 감독  (0) 2021.11.05
    백준 3190 뱀  (0) 2021.11.04

    댓글

Designed by Tistory.