-

[KAKAO_2018] 프렌즈 4블록 본문

1-3. 카카오 SW테스트

[KAKAO_2018] 프렌즈 4블록

asdklfjlasdlfkj 2020. 2. 14. 15:02

https://programmers.co.kr/learn/courses/30/lessons/17679

 

코딩테스트 연습 - [1차] 프렌즈4블록 | 프로그래머스

프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 프렌즈4블록. 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임이다. 만약 판이 위와 같이 주어질 경우, 라이언이 2×2로 배치된 7개 블록과 콘이 2×2로 배치된 4개 블록이 지워진다. 같은 블록은 여러 2×2에 포함될 수 있으며, 지워지는 조건에 만족하는 2×2 모양이 여러 개 있다면

programmers.co.kr

2x2 크기의 동일 블록에 대한 블록게임을 구현하는 문제였다.

먼저 루프를 돌며 같은 모양을 갖는 블록들모임이 존재하는지 확인하고, 해당되는 갯수를 구해 정답에 더해주면 된다.

 

만약 그 갯수가 0이라면 지울 블록이 없다는 의미이므로 더이상 진행하지 않고 빠져나와 정답을 출력하면 된다.

 

핵심은 70번째 줄로 블록을 내려준 뒤에 다음 행 (바로 위 행) 부터 조사해주는 것이다. 저 break;를 안하면 통과하지 않는 테스트케이스 4건이 생긴다. 왜냐하면 기껏 갱신해놓은 r에 루프를 더 돌아 ' '가 아닌 것이 나오면 덮어써버리기 때문이다.

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
#include <string>
#include <vector>
using namespace std;
 
vector<vector<bool> > check;
int height, width;
typedef struct dir{
    int dr, dc;
}dir;
dir d[4= {{00}, {01}, {10}, {11}};
void falsing(){
    for(int r=0; r<height; r++){
        for(int c=0; c<width; c++){
            check[r][c] = false;
        }
    }
}
int solution(int R, int C, vector<string> board) {
    int answer = 0;
    height = R;
    width = C;
    check.assign(R, vector<bool>(C, false));
    while(1){
        int curErase = 0;
        // 1. erase
        for(int r=0; r<R-1; r++){
            for(int c=0; c<C-1; c++){
                char curCharacter = board[r][c];
                if(curCharacter == ' 'continue;
                bool allSame = true;
                for(int i=0; i<4; i++){
                    int nr = r + d[i].dr;
                    int nc = c + d[i].dc;
                    if(board[nr][nc] != curCharacter){
                        allSame = false;
                        break;
                    }
                }
                if(allSame){ // 4개 다 같으면
                    for(int i=0; i<4; i++){
                        int nr = r + d[i].dr;
                        int nc = c + d[i].dc;
                        if(!check[nr][nc]){
                            check[nr][nc] = true;
                            curErase++;
                        }
                    }
                }
            }
        }
        answer += curErase;
        if(curErase == 0break// 안지워진다면 끝. // 지워주기.
        
        for(int r=0; r<R; r++){
            for(int c=0; c<C; c++){
                if(check[r][c]){
                    board[r][c] = ' ';
                }
            }
        } 
        
        // 2. go down
        for(int c=0; c<C; c++){
            for(int r=R-1; r>=0; r--){
                if(board[r][c] == ' '){
                    for(int n_r = r-1; n_r >= 0 ; n_r--){
                        if(board[n_r][c] != ' '){
                            board[r][c] = board[n_r][c];
                            board[n_r][c] = ' ';
                            break;
                        }
                    }
                }
            }
        }        
        falsing();
    }
    return answer;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

Comments