1. 풀이방법
- 문제의 조건을 그대로 구현하는 문제입니다.
- 문제가 길긴 하지만 테스트케이스 와 문제자체(그림)이 친절하게 나와있어서 과정을 체크하기 편했습니다.
- 딱히 알고리즘을 사용할 건 없고 조건에 맞춘 구현만 해주시면 됩니다.
2. 주의사항
- 두번정도 틀린 후에 정답을 맞췄는데, 첫번째 오답의 경우 도미노를 밀 때 효율적으로 짠다셈 치고 뒤에서 부터
- 탐색을 하면서 도형의 자리를 찾았는데 , 오답이 뜬후 디버깅하며 지도 형태를 보니
- (이러한 경우)
- 0 0 0 1 1 0 0 1
0 1 0 1 (--->) 1 1 0 1 (정답)
이렇게 되어야 하는데,
0 0 1 1
(--->) 0 1 1 1 (오답)
- 이러한 실수를 했어서, 앞쪽부터 탐색하는 것으로 바꾸었습니다. (앞으로도 이런문제에서 주의하자..!!)
- 두번째 오답은 도형 유형이 3가지 있는데 테트리스를 생각해 보시면 이게 두줄이 한번에 clear 되는 경우가 발생할 수
- 있습니다. 저 같은 경우 코드 상에서 뒤쪽 부터 탐색 하며 한 행 또는 열 이 클리어 된다면 앞쪽에서 한칸씩 당겨오는
- 방식으로 구현했는데, 이렇게 구현할 경우 땡겨온 다음 그 행 또는 렬 을 한번 더 체크 해주어야 합니다 ( i++ )
- 자세한 것은 주석을 확인해주세요
3. 나의코드
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int N,t,x,y;
int ground[10][10]; //0~9
int resultscore;
int resultblock;
void fillnemo() {
if (t == 1) {
for (int i = 4; i <=9; i++) { //파란색
if (i == 9) { ground[x][i] = 1; break; }
if (ground[x][i+1] == 1) { ground[x][i] = 1; break; }
}
for (int i = 4; i <= 9; i++) { //초록색
if (i == 9) { ground[i][y] = 1; break; }
if (ground[i+1][y] == 1) { ground[i][y] = 1; break; }
}
}
else if (t == 2) {
int tmpindex=10;
for (int i = 4; i <= 9; i++) { //파란색
if (ground[x][i] == 1 ) {
tmpindex = i;
break; }
}
ground[x][tmpindex - 1] = 1; ground[x][tmpindex - 2] = 1;
tmpindex = 10;
for (int i = 4; i <= 9; i++) { //초록색
if (ground[i][y] == 1||ground[i][y+1]==1) {
tmpindex = i;
break;
}
}
ground[tmpindex - 1][y] = 1; ground[tmpindex - 1][y + 1] = 1;
}
else {
int tmpindex = 10;
for (int i = 4; i <= 9; i++) { //파란색
if (ground[x][i] == 1 || ground[x + 1][i] == 1) {
tmpindex = i;
break;
}
}
ground[x][tmpindex - 1] = 1; ground[x + 1][tmpindex - 1] = 1;
tmpindex = 10;
for (int i = 4; i <= 9; i++) { //초록색
if (ground[i][y] == 1 ) {
tmpindex = i;
break;
}
}
ground[tmpindex - 1][y] = 1; ground[tmpindex - 2][y] = 1;
}
}
void delblock() {
//파란색
for (int i = 9; i >= 6; i--) {
bool checking = false;
for (int j = 0; j < 4; j++) {
if (ground[j][i] == 0) { checking = true; break; }
}
if (checking == false) { //4블록이 꽉찬경우
resultscore++;
for (int k = i; k >= 4; k--) { //이동시키기
for (int l = 0; l < 4; l++) { ground[l][k] = ground[l][k-1]; }
}
i++; // 두줄이 한번에 꽉차는 경우를 위해서 이동시킨후 다시 그 행,렬부터 확인해야됨
}
}
//초록색
for (int i = 9; i >= 6; i--) {
bool checking = false;
for (int j = 0; j < 4; j++) {
if (ground[i][j] == 0) { checking = true; break; }
}
if (checking == false) {
resultscore++;
for (int k = i; k >= 4; k--) { //이동시키기
for (int l = 0; l < 4; l++) { ground[k][l] = ground[k-1][l]; }
}
i++; // 두줄이 한번에 꽉차는 경우를 위해서 이동시킨후 다시 그 행,렬부터 확인해야됨
}
}
}
void moveblock() {
//연한 파란색
bool checking = false;
int checkingcount = 0;
for (int i = 4; i <= 5; i++) {
for (int j = 0; j < 4; j++) {
if (ground[j][i] == 1) { checkingcount++; break; }
}
}
if (checkingcount != 0) {
for (int i = 9; i >= 4; i--) {
for (int j = 0; j < 4; j++) {
ground[j][i] = ground[j][i - checkingcount];
}
}
}
for (int i = 4; i <= 5; i++) {
for (int j = 0; j < 4; j++) {
ground[j][i] = 0;
}
}
//연한 초록색
checking = false;
checkingcount = 0;
for (int i = 4; i <= 5; i++) {
for (int j = 0; j < 4; j++) {
if (ground[i][j] == 1) { checkingcount++; break; }
}
}
if (checkingcount != 0) {
for (int i = 9; i >= 4; i--) {
for (int j = 0; j < 4; j++) {
ground[i][j] = ground[i-checkingcount][j];
}
}
}
for (int i = 4; i <= 5; i++) {
for (int j = 0; j < 4; j++) {
ground[i][j] = 0;
}
}
}
void watchground() {
cout << endl;
for (int i = 0; i <= 9; i++) {
for (int j = 0; j <= 9; j++) {
cout << ground[i][j];
}
cout << endl;
}
}
void getblock() {
for (int i = 6; i <= 9; i++) {
for (int j = 0; j < 4; j++) {
if (ground[j][i] == true) resultblock++;
}
}
for (int i = 6; i <= 9; i++) {
for (int j = 0; j < 4; j++) {
if (ground[i][j] == true) resultblock++;
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> N;
while (N--) {
cin >> t >> x >> y;
fillnemo(); // 블록 초록색 파란색으로 이동시키기
delblock(); // 4블록이 꽉찬 행,또는 렬 삭제 (점수 획득)
moveblock(); // 연한초록, 연한파란색에 블록이 있을 경우 이동
}
getblock();
cout << resultscore << "\n";
cout << resultblock << "\n";
return 0;
}
'알고리즘 문제풀이 > 구현' 카테고리의 다른 글
백준 2726 [C++] (0) | 2021.01.16 |
---|---|
백준 10993 [C++] (0) | 2021.01.16 |
백준 20056 [C++] (0) | 2020.12.23 |
백준 20055 [C++] (0) | 2020.12.23 |
백준 13458 [C++] (0) | 2020.12.15 |