[문제풀이] 백준 3019 - 테트리스

kodaaa·2023년 1월 17일
0

문제풀이

목록 보기
21/23
post-thumbnail

📢 문제

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

📢 알고리즘

구현

📢 풀이

#include <iostream>

using namespace std;

int field[100];

int main()
{
  int C, P; // 열, 블록 번호
  int ans = 0;
  cin >> C >> P;
  for (int i = 0; i < C; i++)
  {
    cin >> field[i];
  }

  switch (P)
  {
  case 1:
    // h
    ans += C;
    // hhhh
    for (int i = 0; i < C - 3; i++)
    {
      if (field[i] == field[i + 1] && field[i + 1] == field[i + 2] && field[i + 2] == field[i + 3])
      {
        ans++;
      }
    }
    break;
  case 2:
    // hh
    for (int i = 0; i < C - 1; i++)
    {
      if (field[i] == field[i + 1])
      {
        ans++;
      }
    }
    break;
  case 3:
    for (int i = 0; i < C - 2; i++)
    {
      // h h h+1
      if (field[i] == field[i + 1] && field[i] + 1 == field[i + 2])
      {
        ans++;
      }
    }
    // h h-1
    for (int i = 0; i < C - 1; i++)
    {
      if (field[i] - 1 == field[i + 1])
      {
        ans++;
      }
    }
    break;
  case 4:
    for (int i = 0; i < C - 2; i++)
    {
      // h h-1 h-1
      if (field[i] - 1 == field[i + 1] && field[i + 1] == field[i + 2])
      {
        ans++;
      }
    }
    // h h+1
    for (int i = 0; i < C - 1; i++)
    {
      if (field[i] + 1 == field[i + 1])
      {
        ans++;
      }
    }
    break;
  case 5:
    for (int i = 0; i < C - 2; i++)
    {
      // hhh
      if (field[i] == field[i + 1] && field[i + 1] == field[i + 2])
      {
        ans++;
      }
      // h h-1 h
      if (field[i] - 1 == field[i + 1] && field[i] == field[i + 2])
      {
        ans++;
      }
    }
    for (int i = 0; i < C - 1; i++)
    {
      // h h+1
      if (field[i] + 1 == field[i + 1])
      {
        ans++;
      }
      // h h-1
      if (field[i] - 1 == field[i + 1])
      {
        ans++;
      }
    }
    break;
  case 6:
    for (int i = 0; i < C - 2; i++)
    {
      // hhh
      if (field[i] == field[i + 1] && field[i + 1] == field[i + 2])
      {
        ans++;
      }
      // h h+1 h+1
      if (field[i] + 1 == field[i + 1] && field[i + 1] == field[i + 2])
      {
        ans++;
      }
    }
    for (int i = 0; i < C - 1; i++)
    {
      // h h-2
      if (field[i] - 2 == field[i + 1])
      {
        ans++;
      }
      // hh
      if (field[i] == field[i + 1])
      {
        ans++;
      }
    }
    break;
  case 7:
    for (int i = 0; i < C - 2; i++)
    {
      // hhh
      if (field[i] == field[i + 1] && field[i + 1] == field[i + 2])
      {
        ans++;
      }
      // h h h-1
      if (field[i] == field[i + 1] && field[i] - 1 == field[i + 2])
      {
        ans++;
      }
    }
    for (int i = 0; i < C - 1; i++)
    {
      // hh
      if (field[i] == field[i + 1])
      {
        ans++;
      }
      // h h+2
      if (field[i] + 2 == field[i + 1])
      {
        ans++;
      }
    }
    break;
  default:
    break;
  }

  cout << ans;
}
  • 블록의 윗면은 중요하지 않음! 필드와 닿는 아랫면만 중요!!
    ⭐ 문제에 영향을 끼치지 않는 중요하지 않은 부분은 무시해야 할 수도 있다
  • 블록 아랫면의 높이차이가 필드의 높이차이와 같아야 블록과 필드 사이에 빈공간이 생기지 않는다
  • 구현 문제는 생각보다 노가다가 많을 수 있다! 노가다 두려워하지 말기⭐
  • 아이디어만 떠올리면 구현은 쉬웠는데.. 아이디어를 못 떠올림ㅠㅠ 다들 천재인걸까?

참고
https://yabmoons.tistory.com/53

profile
취뽀하자(●'◡'●)💕

0개의 댓글