본문 바로가기
프로그래머스

[프로그래머스] 2018 KAKAO BLIND RECRUITMENT - [1차] 프렌즈4블록, C++

by 황인태(intaehwang) 2020. 1. 4.
반응형

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

 본 문제는 '2018 KAKAO BLIND RECRUITMENT'로 kakao Tech에 의하면 "정답률48.01%"이다. 난이도는 상으로 구분되어 있다.

2x2의 크기에 블록이 만약 같은 블록이면 없어지고, 위에 있는 블록이 밑으로 내려오게 하는 문제다. 개인적으로 백준 SW 역량 테스트 준비 - 문제 (시뮬레이션)에 있는 '미네랄'과 유사하다고 생각한다. 하지만 미네랄에서는 밑으로 내려올 때, 미네랄 덩어리가 내려오기 때문에 미네랄 문제가 [1차] 프렌즈4블록의 문제보다 까다롭다고 생각한다.

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

 

2933번: 미네랄

문제 창영과 상근은 한 동굴을 놓고 소유권을 주장하고 있다. 두 사람은 막대기를 서로에게 던지는 방법을 이용해 누구의 소유인지를 결정하기로 했다. 싸움은 동굴에서 벌어진다. 동굴에는 미네랄이 저장되어 있으며, 던진 막대기가 미네랄을 파괴할 수도 있다. 동굴은 R행 C열로 나타낼 수 있으며, R×C칸으로 이루어져 있다. 각 칸은 비어있거나 미네랄을 포함하고 있으며, 네 방향 중 하나로 인접한 미네랄이 포함된 두 칸은 같은 클러스터이다. 창영은 동굴의 왼쪽에

www.acmicpc.net

 참고로 [1차] 프렌즈4블록을 풀 때, 위에서 밑으로 빈 공간으로 블록이 내려올 때, 빈 공간만큼 한번에 내려오게 코딩하고 싶었지만, 구현하다 안되서 포기하고 한 칸씩 내려가도록 구현했다. 다음에 다시 구현해봐야겠다.

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
#include <string>
#include <vector>
#include <iostream>
#include <queue>
 
using namespace std;
 
int solution(int m, int n, vector<string> board) {
    int answer = 0;
    bool chk;
    queue<pair<intint>> q;
    do {
        chk = true;
        for (int i = 0; i < m-1; i++) {
            for (int j = 0; j < n-1; j++) {
                char tmp = board[i][j];
                if (tmp == '0'continue;
                // 2x2 블록 탐색
                if (tmp == board[i+1][j] && tmp == board[i][j+1&& tmp == board[i+1][j+1]) {
                    chk = false;
                    q.push(make_pair(i, j));
                    q.push(make_pair(i+1, j));
                    q.push(make_pair(i, j+1));
                    q.push(make_pair(i+1, j+1));
                }
            }
        }
        // 블록 지우기
        while (!q.empty()) {
            int x = q.front().first;
            int y = q.front().second;
            q.pop();
            board[x][y] = '0';
        }
        bool is_true;
        // 위에서 밑으로 빈 공간으로 한 칸씩 블록 내리기
        do {
            is_true = true;
            for (int j = 0; j < n; j++) {
                for (int i = 0; i < m-1; i++) {
                    if (board[i][j] != '0' && board[i+1][j] == '0') {
                        is_true = false;
                        board[i+1][j] = board[i][j];
                        board[i][j] = '0';
                    }
                }
            }
        } while (!is_true);
    } while (!chk);
    // 빈 공간 개수 cnt
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (board[i][j] == '0') answer += 1;
        }
    }
    // 블록 이동 결과 출력
    /*
    for (int i = 0 ; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cout << board[i][j];
        }
        cout << "\n";
    }
    */
    return answer;
}
cs

반응형
Buy me a coffeeBuy me a coffee

댓글