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<int, int>> 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 |
'프로그래머스' 카테고리의 다른 글
[프로그래머스] 2018 KAKAO BLIND RECRUITMENT - [1차] 캐시, C++ (0) | 2020.01.04 |
---|---|
[프로그래머스] 2018 KAKAO BLIND RECRUITMENT - [1차] 뉴스 클러스터링, C++ (0) | 2020.01.04 |
[프로그래머스] 2018 KAKAO BLIND RECRUITMENT - [3차] n진수 게임, C++ (0) | 2020.01.04 |
[프로그래머스] 2018 KAKAO BLIND RECRUITMENT - [3차] 압축, C++ (0) | 2020.01.04 |
[프로그래머스] 2018 KAKAO BLIND RECRUITMENT - [3차] 파일명 정렬, C++ (0) | 2020.01.04 |
댓글