[프로그래머스/C++]Lv.0 - 안전지대

YH J·2023년 4월 25일
0

프로그래머스

목록 보기
74/168

문제 링크

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

시도한 방법

  1. 노가다 - 실패
  2. map에 옮겨담은 후 1인원소 찾아내서 그 주변과 본인 모두 value++한다.
    그 뒤 0인것만 찾아 answer++하기
    -> 끝자리에 걸치는 것들 처리하는데 문제, 굳이 맵을?
  3. 2차원 array로 구현하기
    -> n+2 * n+2 의 범위의 2차원 array를 만들어두고 1 ~ n 범위만 쓴다.
    board를 arr1의 1~n범위에 옮긴 후 arr1을 검사하면서 1인 원소의 주변과 해당 원소를 1로 만드는데 그냥 arr1에서 하면 1을만나서 주변을 1이나 다른 원소로했을 때 다른 지뢰가 사라지거나 0인부분이 1이되어 지뢰로 될 수 있으므로 arr2를 추가하여 arr2에 적용시켜준다. 끝나면 arr2의 1~n범위에서 0인 부분만 ++해준다.

내 코드

#include <string>
#include <vector>

using namespace std;

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

다른 사람의 풀이

#include <string>
#include <vector>

using namespace std;

int solution(vector<vector<int>> board) {
    int answer = 0;

    const int n = board.size();
    const int m = board[0].size();
    vector<vector<int>> offset{{-1,-1},{-1,0},{-1,1},{0,-1},{0,0},{0,1},{1,-1},{1,0},{1,1}};

    for(int i = 0; i < n; ++i)
    {
        for(int j = 0; j < m; ++j)
        {
            bool passed = true;
            for(const auto& v : offset)
            {
                int ni = i + v[0];
                int nj = j + v[1];
                if(ni >= 0 && ni < n && nj >= 0 && nj < m)
                {
                    if(board[ni][nj] == 1)
                    {
                        passed = false;
                        break;
                    }
                }
            }

            answer += passed;
        }
    }

    return answer;
}

다른 사람의 풀이 해석

1을 찾아서 주변을 1로 만들기 보다 모든 원소에 대해 주변에 1이 있는지 검사 후 없으면 answer ++ 한다.

profile
게임 개발자 지망생

0개의 댓글