[프로그래머스 C++] [1차] 프렌즈4블록
[프로그래머스 C++] [1차] 프렌즈4블록
https://school.programmers.co.kr/learn/courses/30/lessons/17679
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
해결전략
구현
코드
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<string> v;
int solution(int m, int n, vector<string> board) {
int answer = 0; // 제거된 블록의 개수를 저장할 변수
v = board;
while (true)
{
vector<pair<int, int>> coor; // 2x2 블록의 좌측 상단 좌표를 저장할 벡터
vector<vector<int>> ch(m, vector<int>(n, 0)); // 각 블록의 제거 여부를 저장할 2차원 벡터
// 모든 블록을 순회하며 2x2 블록을 찾음
for (int y = 0; y < m - 1; y++) {
for (int x = 0; x < n - 1; x++) {
if (v[y][x] == ' ') continue; // 빈 블록은 건너뜀
// 2x2 블록을 찾으면 좌표를 저장하고, 제거 표시를 함
if (v[y][x] == v[y][x + 1] && v[y + 1][x] == v[y + 1][x + 1] && v[y][x] == v[y + 1][x]) {
coor.push_back({ y, x });
ch[y][x] = ch[y][x + 1] = ch[y + 1][x] = ch[y + 1][x + 1] = 1;
}
}
}
if (coor.size() == 0) break; // 더 이상 제거할 블록이 없으면 반복을 종료
// 모든 블록을 순회하며 제거 표시된 블록을 제거하고, 그 위의 블록을 아래로 내림
for (int y = 0; y < m; y++) {
for (int x = 0; x < n; x++)
{
if (ch[y][x] == 1)
{
answer++; // 제거된 블록 개수를 증가
if (y == 0) continue; // 맨 위 블록은 건너뜀
// 현재 블록 위의 모든 블록을 한 칸씩 아래로 내림
for (int k = y - 1; k >= 0; k--) {
v[k + 1][x] = v[k][x];
v[k][x] = ' ';
}
}
}
}
}
return answer; // 제거된 블록의 개수를 반환
}
int main()
{
vector<string> testcase1 = { "CCBDE", "AAADE", "AAABF", "CCBBF" };
vector<string> testcase2 = { "TTTANT", "RRFACC", "RRRFCC", "TRRRAA", "TTMMMF", "TMMTTJ" };
cout << solution(4, 5, testcase1);
return 0;
}
'⭐ 코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 C++] 2 x n 타일링 (0) | 2023.11.02 |
---|---|
[프로그래머스 C++] 숫자 변환하기 (0) | 2023.11.01 |
[프로그래머스 C++] 롤 케이크 자르기 (0) | 2023.10.25 |
[프로그래머스 C++] [3차] 파일명 정렬 (0) | 2023.10.24 |
[프로그래머스 C++] 오픈채팅방 (0) | 2023.10.23 |
댓글
이 글 공유하기
다른 글
-
[프로그래머스 C++] 2 x n 타일링
[프로그래머스 C++] 2 x n 타일링
2023.11.02 -
[프로그래머스 C++] 숫자 변환하기
[프로그래머스 C++] 숫자 변환하기
2023.11.01 -
[프로그래머스 C++] 롤 케이크 자르기
[프로그래머스 C++] 롤 케이크 자르기
2023.10.25 -
[프로그래머스 C++] [3차] 파일명 정렬
[프로그래머스 C++] [3차] 파일명 정렬
2023.10.24