-
고민
처음에는 주어진 테트리스 모양을 전부 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; }