Lv 0. 안전지대

https://school.programmers.co.kr/learn/courses/30/lessons/120866

 

#include <string>
#include <vector>
#include <iostream>
using namespace std;

int dx[8]={1,0,-1,0,1,-1,-1,1};
int dy[8]={0,1,0,-1,1,1,-1,-1};


int solution(vector<vector<int>> board) {
    int answer = 0;
    int n=board.size();
    // cout<<n<<": n의 값";
    for(int i=0; i<n;i++){
        for(int j=0; j<n; j++){
            if(board[i][j]==1){
                for(int dir=0; dir<8; dir++){
                    int nx=i+dx[dir];
                    int ny=j+dy[dir];//처음에 j를 i로 작성해서 잘못됨. y의 좌표로 놓아야 하니까 j로 놓아야 한다. 
                    if(nx<0 || nx>=n || ny<0 || ny>=n) continue;
                    if(board[nx][ny]==2) continue;
                    if(board[nx][ny]==1) continue;
                    if(board[nx][ny]==0) board[nx][ny]=2;
                }
            }
        }
    } 
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            if(board[i][j]==0) answer++;
        }
    }
    //위험지역 체크한 보드를 확인해보기 위한 보드 출력
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cout<<board[i][j]<<' ';
        }
        cout<<'\n';
    }
    return answer;
}

처음에 위와 같은 형태로 프로그램을 작성할때, int ny= j+ dy[dir]; 형태로 작성해야 하는데, int ny = i + dy[dir]; 로 작성해버려서, 보드에 폭발범위 영역을 표시하는 2의 값을 입히는 부분이 어긋나 있는것을 변형된 보드 출력을 통해서 확인한뒤에, int ny= j+ dy[dir]; 로 수정해서 통과할 수 있었다. 코드 작성의 형태가 bfs 형태의 문제와 비슷하게 보일 수 있는데, 차이점으로는 queue를 이용하지 않아서 상하좌우에 있는 형태의 폭탄들을 따라가는 형태의 코드가 아니라는 것이다. 그저 폭탄 하나에 8방으로 폭발범위 영역을 표시하면 되니까 이중for문을 다 돌면서 해당 영역이 폭발범위이면 2로 체크하고, 폭탄이거나 다른 폭탄에 의한 기존에 표시된 폭발범위라면 continue 하는 형태로 프로그램을 작성하였다. 물론 폭탄만 아니면 다시 2로 체크하는 형태로 작성해도 통과하는데는 지장이 없을 것으로 보이나 더욱 정확하게 표현하고 싶어서 폭탄인지, 기존의 폭발범위인지에 대한 체크까지 진행하였다. 

 

다른 사람의 풀이들을 보니까 전반적으로 내가 해결한 방법과 비슷한 풀이들이 많았는데, 

가장 처음에 올라와있는 풀이가 굉장히 광기가 느껴져서 그 풀이를 한번 첨부해보도록 하겠다. 

#include <string>
#include <vector>

using namespace std;

int solution(vector<vector<int>> board) {
    int answer = 0;
    for(int i =0; i< board.size(); i++){
        for(int j=0; j<board.size(); j++){
            if(board[i][j]==1){
                if(i==0){
                    if(j==0){
                        if(j<board.size()-1&&board[i][j+1]==0)board[i][j+1]=2;
                        if(i<board.size()-1&&board[i+1][j]==0)board[i+1][j]=2;
                        if(i<board.size()-1&&j<board.size()-1&&board[i+1][j+1]==0)board[i+1][j+1]=2;
                    }
                    else if(j==board.size()-1){
                        if(j>0&&board[i][j-1]==0)board[i][j-1]=2;
                        if(i<board.size()-1&&board[i+1][j]==0)board[i+1][j]=2;
                        if(j>0&&i<board.size()-1&&board[i+1][j-1]==0)board[i+1][j-1]=2;
                    }
                    else{
                        if(j>0&&board[i][j-1]==0)board[i][j-1]=2;
                        if(i<board.size()-1&&board[i+1][j]==0)board[i+1][j]=2;
                        if(j>0&&i<board.size()-1&&board[i+1][j-1]==0)board[i+1][j-1]=2;
                        if(j<board.size()-1&&board[i][j+1]==0)board[i][j+1]=2;
                        if(i<board.size()-1&&j<board.size()-1&&board[i+1][j+1]==0)board[i+1][j+1]=2;
                    }
                }
                else if(i==board.size()-1){
                    if(j==0){
                        if(j<board.size()-1&&board[i][j+1]==0)board[i][j+1]=2;
                        if(i>0&&board[i-1][j]==0)board[i-1][j]=2;
                        if(j<board.size()-1&&board[i-1][j+1]==0)board[i-1][j+1]=2;
                    }
                    else if(j==board.size()-1){
                        if(j>0&&board[i][j-1]==0)board[i][j-1]=2;
                        if(i>0&&board[i-1][j]==0)board[i-1][j]=2;
                        if(i>0&&j>0&&board[i-1][j-1]==0)board[i-1][j-1]=2;
                    }
                    else{
                        if(j>0&&board[i][j-1]==0)board[i][j-1]=2;
                        if(i>0&&board[i-1][j]==0)board[i-1][j]=2;
                        if(i>0&&j>0&&board[i-1][j-1]==0)board[i-1][j-1]=2;
                        if(j<board.size()-1&&board[i][j+1]==0)board[i][j+1]=2;
                        if(i>0&&j<board.size()-1&&board[i-1][j+1]==0)board[i-1][j+1]=2;
                    }
                }
                else{
                    if(j==0){
                        if(i>0&&board[i-1][j]==0)board[i-1][j]=2;
                        if(i<board.size()-1&&board[i+1][j]==0)board[i+1][j]=2;
                        if(j<board.size()-1&&board[i][j+1]==0)board[i][j+1]=2;
                        if(i<board.size()-1&&j<board.size()-1&&board[i+1][j+1]==0)board[i+1][j+1]=2;
                        if(i>0&&j<board.size()-1&&board[i-1][j+1]==0)board[i-1][j+1]=2;
                    }
                    else if(j==board.size()-1){
                        if(i>0&&board[i-1][j]==0)board[i-1][j]=2;
                        if(i<board.size()-1&&board[i+1][j]==0)board[i+1][j]=2;
                        if(j>0&&board[i][j-1]==0)board[i][j-1]=2;
                        if(j>0&&i<board.size()-1&&board[i+1][j-1]==0)board[i+1][j-1]=2;
                        if(i>0&&j>0&&board[i-1][j-1]==0)board[i-1][j-1]=2;
                    }
                    else{
                        if(i>0&&board[i-1][j]==0)board[i-1][j]=2;
                        if(i<board.size()-1&&board[i+1][j]==0)board[i+1][j]=2;
                        if(j>0&&board[i][j-1]==0)board[i][j-1]=2;
                        if(j>0&&i<board.size()-1&&board[i+1][j-1]==0)board[i+1][j-1]=2;
                        if(i>0&&j>0&&board[i-1][j-1]==0)board[i-1][j-1]=2;
                        if(board[i][j+1]==0)board[i][j+1]=2;
                        if(i<board.size()-1&&j<board.size()-1&&board[i+1][j+1]==0)board[i+1][j+1]=2;
                        if(i>0&&j<board.size()-1&&board[i-1][j+1]==0)board[i-1][j+1]=2;
                    }
                }
            }
        }
    }
    for(int i=0; i<board.size(); i++){
        for(int j=0; j<board.size(); j++)
            if(board[i][j]==0)answer++;
    }
    return answer;
}

위의 코드의 경우는 테투리 영역으로 갔을때 보드를 넘어서는 부분에 대한 판단을 하지 않기 위해서 예외처리를 코드 자체에 경우의 수들을 나누어서 녹여낸 형태인데, 더욱 쉽고 간결하게 표현할 수 있는 방법이 있지만 그걸 하지 않고 위와 같이 직접 코드를 작성할때 경우들을 나누어서 if 문 형태로 구분지은 것인데, 어찌보면 굉장히 비효율적이고 코드도 길어서 가독성도 떨어지는 형태의 프로그램이지만, 결국에 이걸 작성하신 분은 이렇게라도 문제를 해결하는 프로그램을 만들어내서 통과하신 분이기 때문에, 이런 부분을 보고 배울점이 참 많다고 느껴서 첨부해보았다. 

 

어떻게든 내게 현재 주어진 상황에서 내가 가지고 있는 지식을 기반으로 주어진 문제를 해결하는 프로그램을 만들어낸다면 그걸로 충분하다. 개선은 하다보면 더욱 더 발전하고 나아질 것이기 때문에 가장 우선시 할 부분은 해결해야 하는 문제를 정확하게 해결해낼 수 있는 프로그램을 만들어내는 것이다. 어떻게든 이렇게 문제를 해결해낼 수 있는 프로그램을 만들어내도록 하자. 

 

 

  Comments,     Trackbacks