[백준/c++] 16918번: 봄버맨

somyeong·2022년 5월 4일
0

코테 스터디

목록 보기
11/52

문제 링크 - https://www.acmicpc.net/problem/16918

🌱 문제

(길어서 나머지는 링크에서 보기)


🌱 풀이

문제 접근

  • 문제를 봤을 때, 구현과 그래프(약간)가 합쳐진 문제라고 생각이 들었다.
  • 문제에 써있는 과정을 그대로 각각의 함수를 나누어서, 어떤 시간(초)에 어떤 함수를 실행해야하는지를 구현해주었다.

풀이 과정

  • 1초에는 그대로 출력된다
  • 짝수 초에는 폭탄이 좌표 전체에 설치되고
  • 홀수 초에는 폭탄 전체 설치 이전에 있던 폭탄들이 터진다. (그 인접한 좌표의 폭탄도 함께)
  • 폭탄이 터질때, 현재 초에서 2초전에 폭탄이 있던 좌표를 기억해두어야 하므로 save 배열에 저장해두었다.
  • 폭탄 터지는 과정이 끝나면, 그때의 결과를 save에 다시 저장해두고 그 다다음초에 폭탄이 터질때 윗줄 과정을 반복한다.

짝수 초인 경우

  • 배열을 전부 폭탄으로 채운다
void install(){ //짝수초에 모든칸에 폭탄이 설치되는 경우: 모든칸을 0으로 채워준다.
    for(int i=0; i<r; i++){
        for(int j=0; j<c; j++){
            arr[i][j]='O';
        }
    }
}

홀수 초인 경우

  • 폭탄 전체 설치 이전(즉 2초전)에 존재하던 폭탄들이 터진다 (+ 인접 폭탄들도)
void bomb(){//홀수초에 폭탄이 터지는 경우: save에서 폭탄이 터진결과를 arr에 갱신하고, 그 arr의 save에도 다시 저장한다.
    for(int i=0; i<r; i++){
        for(int j=0; j<c; j++){
            if(save[i][j]=='O'){
                int x=i; int y=j;
                arr[x][y]='.'; //현재 좌표 터뜨리기.
                for(int k=0; k<4; k++){ //인접한 칸 터뜨리기
                    int nx=x+dx[k]; 
                    int ny=y+dy[k];
                    if(nx>=0 && ny>=0 && nx<r && ny<c){
                        arr[nx][ny]='.';
                        
                    }
                }
            }
        }
    }

    //save에 arr의 결과 저장하기
    for(int i=0; i<r; i++){
        for(int j=0; j<c; j++){
            save[i][j]=arr[i][j]; //save 배열에 arr 배열 저장하기.
        }
    }

}

🌱 코드

//16918번: 봄버맨
/*

R,C,N
( 1<= R,C,N <= 200)
빈칸: .
폭탄: 0

*/
#include <iostream>
using namespace std;
int r,c,n;
char arr[200][200]; //격자판 배열
char save[200][200];//arr배열 저장해놓는 용도
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};

void printArr(){ //배열 출력 함수
    for(int i=0; i<r; i++){
        for(int j=0; j<c; j++){
            cout<<arr[i][j];
        }
        cout<<"\n";
    }
}

void install(){ //짝수초에 모든칸에 폭탄이 설치되는 경우: 모든칸을 0으로 채워준다.
    for(int i=0; i<r; i++){
        for(int j=0; j<c; j++){
            arr[i][j]='O';
        }
    }

}

void bomb(){//홀수초에 폭탄이 터지는 경우: save에서 폭탄이 터진결과를 arr에 갱신하고, 그 arr의 save에도 다시 저장한다.
    for(int i=0; i<r; i++){
        for(int j=0; j<c; j++){
            if(save[i][j]=='O'){
                int x=i; int y=j;
                arr[x][y]='.'; //현재 좌표 터뜨리기.
                for(int k=0; k<4; k++){ //인접한 칸 터뜨리기
                    int nx=x+dx[k]; 
                    int ny=y+dy[k];
                    if(nx>=0 && ny>=0 && nx<r && ny<c){
                        arr[nx][ny]='.';
                        
                    }
                }
            }
        }
    }

    //save에 arr의 결과 저장하기
    for(int i=0; i<r; i++){
        for(int j=0; j<c; j++){
            save[i][j]=arr[i][j]; //save 배열에 arr 배열 저장하기.
        }
    }

}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    cin>>r>>c>>n;
    for(int i=0; i<r; i++){
        for(int j=0; j<c; j++){
            cin>>arr[i][j];
            save[i][j]=arr[i][j];
        }
    }

    if(n==1){ //1초후는 그대로
        printArr();
        return 0;
    }

    for(int i=1; i<=n; i++){
        if(i==1)
            continue;

        if(i%2==0){ // 짝수초면 폭탄 전체 설치하기
            install();
        }else{ //홀수초면 폭탄이 폭발.
            bomb();
        }
    }

    printArr();
    
}
profile
공부한 내용 잊어버리지 않게 기록하는 공간!

0개의 댓글