• 문제

    1

  • 고민

    처음에는 주어진 테트리스 모양을 전부 4차원 배열로 구현했었다. 한번에 정답을 풀지 못하여 해매다가 생각해보니 테트리스의 블럭이 맞닿는 면만 계산하면 블럭과 쌓여있는 테트리스 블럭간의 공백을 계산할 수 있었다. 테트리스의 가장 낮은 부분을 0이라 생각하고 각각의 높이를 계산하여 답을 구할 수 있었다. 어떤 문제를 봤을 때 보다 쉽게 풀 수 있는지 계속 생각해보고 구현을 시작해야 겠다.

  • 코드

    // https://www.acmicpc.net/problem/3019
    #include <iostream>
    #include <string>
    using namespace std;
      
    int n, b;
    int height[1011];
      
    int isfixed(string s, int col) {
    	if (col + s.size() - 1> n) {
    		return 0;
    	}
    	int base = height[col] - (s[0] - '0');
    	for (int i = 0; i < s.size(); i++) {
    		if (base != height[col + i] - (s[i] - '0')) {
    			return 0;
    		}
    	}
    	return 1;
    }
      
    int main() {
    	ios::sync_with_stdio(false);
    	cin >> n >> b;
    	for (int j = 1; j <= n; j++) {
    		int col;
    		cin >> col;
    		height[j] = col;
    	}
    	int ans = 0;
    	// col
    	for (int j = 1; j <= n; j++) {
    		if (b == 1) {
    			ans += isfixed("0", j) + isfixed("0000", j);
    		} else if (b == 2) {
    			ans += isfixed("00", j);
    		} else if (b == 3){
    			ans += isfixed("001", j) + isfixed("10", j);
    		} else if (b == 4) {
    			ans += isfixed("100", j) + isfixed("01", j);
    		} else if (b == 5) {
    			ans += isfixed("000", j) + isfixed("01", j) + isfixed("101", j) + isfixed("10", j);
    		} else if (b == 6) {
    			ans += isfixed("000", j) + isfixed("00", j) + isfixed("011", j) + isfixed("20", j);
    		} else if (b == 7) {
    			ans += isfixed("000", j) + isfixed("02", j) + isfixed("110", j) + isfixed("00", j);
    		}
    	}
      	
    	cout << ans << '\n';
    	return 0;
    }