본문 바로가기

프로그래머스 코딩 문제/카카오 기출문제

[프로그래머스] 프렌즈4블록 (2018 KAKAO BLIND RECRUITMENT)

문제 링크 :  programmers.co.kr/learn/courses/30/lessons/17679

 

시뮬레이션 문제

 

<전체적인 알고리즘>

1. 네 블록이 같은 곳들 전부 터트려준다(check이차원 배열에 표시)

2. 터트려주면 열마다 밑에서 올라오면서 제자리로 떨어뜨려준다.(자신보다 밑에서 터진 개수만큼 떨구면 됨)

3.  1,2 를 반복하다가 더이상 터지는 곳이 없으면 종료.

 

 

<전체 코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <string>
#include <vector>
 
using namespace std;
 
 
int m=6;
int n=6;
vector<string> board;
bool check[32][32];   //터지는 곳 체크
 
bool explode()   //4개 같은블록들 터트리기
{
    bool is_exploded = false;
    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] == '0')continue//빈 공간이면 스킵
            if (c == board[i][j + 1] && c == board[i + 1][j] && c == board[i + 1][j + 1])
            {
                is_exploded = true;
                check[i][j] = true;
                check[i][j + 1] = true;
                check[i + 1][j] = true;
                check[i + 1][j + 1] = true;
            }
        }
    }
    return is_exploded;
}
 
void fall()
{
    for (int j = 0; j < n; j++)
    {
        int empty_count = 0;   //터진 개수 카운트
        for (int i = m-1; i >=0; i--)     //열마다 밑에서부터 순차탐색하면서 제자리 찾기
        {
            if (check[i][j] == true)
            {
                empty_count++;  //터진 개수 세기
            }
            else
            {
                board[i + empty_count][j] = board[i][j]; // 자신보다 밑에서 터진 개수만큼 내려가야함
            }      
        }
 
        for (int i = 0; i < empty_count; i++)
        {
            board[i][j] = '0'//터진개수만큼 끝에서 부터 빈공간으로 채우기
        }
    }
}
 
int solution(int m2, int n2, vector<string> boards) {
    board=boards;
    m=m2;
    n=n2;
    fill(&check[0][0],&check[29][30],0);
     
    while (1)
    {      
        bool is_exploded=explode();  //터지는 부분 check하기
        if (!is_exploded)break;   //터진블록들 없으면 탈출
 
        fall();       //블록들 떨어뜨리기
        fill(&check[0][0], &check[29][30], 0);
    }
 
    int count = 0;
    for (int i = 0; i < m; i++)   //빈 공간들 갯수 구하기(빈공간 = 터진 개수)
    {
        for (int j = 0; j < n; j++)
        {
            if (board[i][j] == '0')count++; 
        }
    }  
    return count;
}

 

궁금하신 점은 댓글에 남겨주시면 답변드리겠습니다.

반응형