끄적끄적 코딩
article thumbnail

2019 KAKAO BLIND RECRUITMENT (2019 카카오 블라인드 채용 문제)

블록 게임을 통해 총 몇개의 블록이 제거되는지 찾는 문제입니다.


문제


1. 2*2 블럭의 모양이 모두 같으면 해당 2*2 블럭은 제거됩니다.
2. 1.번을 통해 블럭들이 제거되면 블럭들 아래에 블럭이 없는 경우 블럭을 내립니다.
3. 1, 2번을 더 이상 할 수 없을때 까지 반복한 후 제거된 블럭 개수를 출력합니다.


해결 방법

1. temp = board (temp는 제거될 블럭들을 임시적으로 표시하는 용도)
2. 반복문을 통해 2*2 모양이 같은 블럭 탐색
2-1. 같은 경우 temp에 해당 블럭들 체크 (' ' 공백으로 처리)
2-2. check 변수를 true 변경 (블럭 제거 과정이 있었다는 것을 의미)
3. 반복문을 통해 temp에 블럭 밑에 ' ' 공백이 있는 경우 블럭을 아래로 내림
4. board = temp
5. check가 false일 때 (블럭 제거 과정이 없을 경우)까지 1~5 반복
6. board에 ' ' 공백의 개수를 카운트해서 출력

 

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int solution(int m, int n, vector<string> board)
{
  int answer = 0;
  bool check = true;
  vector<string> temp;

  while (check)
  {
    check = false;
    temp = board;
    for (int i = 0; i < m - 1; ++i)
    {
      for (int j = 0; j < n - 1; ++j)
      {
        char c = board[i][j];
        if (board[i][j] != ' ' && board[i][j + 1] == c && board[i + 1][j] == c && board[i + 1][j + 1] == c)
        {
          check = true;
          temp[i][j] = ' ';
          temp[i][j + 1] = ' ';
          temp[i + 1][j] = ' ';
          temp[i + 1][j + 1] = ' ';
        }
      }
    }

    for (int i = 1; i < m; ++i)
    {
      for (int j = 0; j < n; ++j)
      {
        int k = 1;
        if (temp[i][j] != ' ')
        {
          continue;
        }
        while (i - k >= 0)
        {
          if (temp[i - k][j] != ' ')
          {
            temp[i - k + 1][j] = temp[i - k][j];
            temp[i - k][j] = ' ';
            ++k;
          }
          else
          {
            temp[i - k + 1][j] = ' ';
            break;
          }
        }
      }
    }
    board = temp;
  }

  for (int i = 0; i < m; ++i)
  {
    for (int j = 0; j < n; ++j)
    {
      if (board[i][j] == ' ')
      {
        ++answer;
      }
    }
  }

  return answer;
}

검색 태그