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

2024. 6. 21. 19:47·코딩테스트/프로그래머스 (Lv. 0)
목차
  1. 문제 설명
  2. 제한 사항
  3. 입출력 예
  4. 문제 풀이
728x90
반응형

문제 설명

다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.


지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.

 

제한 사항

  • board는 n * n 배열입니다.
  • 1 ≤ n ≤ 100
  • 지뢰는 1로 표시되어 있습니다.
  • board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.

입출력 예

 

board result
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]] 13
[[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]] 0
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0]] 16

 

입출력 예 #1

  • (3, 2)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선 총 8칸은 위험지역입니다. 따라서 16을 return합니다.

입출력 예 #2

  • (3, 2), (3, 3)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선은 위험지역입니다. 따라서 위험지역을 제외한 칸 수 13을 return합니다.

입출력 예 #3

  • 모든 지역에 지뢰가 있으므로 안전지역은 없습니다. 따라서 0을 return합니다.

문제 풀이

이번 문제는 간단히 생각해서 지뢰가 위치한 곳과 해당 위치를 기준으로 8방향을 제외한 남은 공간의 수를 구하는 문제입니다.

 

저는 지뢰의 위치(y, x)들을 저장하는 배열을 만들고, 모든 위치를 순회하며 8방향을 전부 1의 값으로 변화시켰습니다. 또한 이 과정에서 현재 위험 구역(지뢰 or 지뢰의 8방향)의 수를 체크하여 전체 보드의 수(n * n)에서 빼는 방식으로 문제를 해결하였습니다.

 

> 8방향 위치를 쉽게 순회하기 위한 변화량 배열(dy, dx)

// 8방향 위치 배열 (상, 우상, 우, 우하, 하, 좌하, 좌, 좌상 순서)
int dy[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };
int dx[8] = { 0, 1, 1, 1, 0, -1, -1, -1 };

 

더보기
#include <string>
#include <vector>

using namespace std;

// 8방향 위치 배열 (상, 우상, 우, 우하, 하, 좌하, 좌, 좌상 순서)
int dy[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };
int dx[8] = { 0, 1, 1, 1, 0, -1, -1, -1 };

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

    // 지뢰가 매설된 위치를 저장하기 위한 배열 (y, x의 위치 배열)
    vector<pair<int, int>> loc;

    // 위험 지역의 수를 누적하기 위한 변수
    int risk = 0;

    for (int y = 0; y < board.size(); y++)
    {
        for (int x = 0; x < board.size(); x++)
        {
            // 폭탄이 존재한다면?
            if (board[y][x] == 1)
            {
                // 위치 배열에 해당 좌표 넣기
                loc.push_back(make_pair(y, x));
            }
        }
    }

    // 위치 배열에 들어있는 지뢰의 수만큼 위험 지역이라고 표시하기
    risk += loc.size();

    // 위치 배열에 들어있는 지뢰의 위치를 순회하며 주변 8방향 위험 지역(1)으로 설정하기
    for (int i = 0; i < loc.size(); i++)
    {
        for (int j = 0; j < 8; j++)
        {
            int ny = loc[i].first + dy[j];
            int nx = loc[i].second + dx[j];

            // 만약 해당 위치가 보드의 범위를 벗어난다면 - 건너뛰기
            if (nx < 0 || ny < 0 || nx >= board.size() || ny >= board.size()) continue;
            // 만약 해당 위치가 이미 지롸가 있거나, 위험 지역이라면? - 건너뛰기
            if (board[ny][nx] == 1) continue;

            // 위험 지역(1)으로 설정하기
            board[ny][nx] = 1;
            // 위험 지역의 수 증가시키기
            risk++;
        }
    }

    // 전체 지역의 수에서 위험 지역의 수 빼기
    answer = board.size() * board.size() - risk;

    return answer;
}
728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'코딩테스트 > 프로그래머스 (Lv. 0)' 카테고리의 다른 글

[프로그래머스/C++ 문제 풀이] Lv. 0 - [PCCE 기출문제] 8번 / 창고 정리  (0) 2024.06.24
[프로그래머스/C++ 문제 풀이] Lv. 0 - 연속된 수의 합  (0) 2024.06.22
[프로그래머스/C++ 문제 풀이] Lv. 0 - 분수의 덧셈  (0) 2024.06.21
[프로그래머스/C++ 문제 풀이] Lv. 0 - 주사위 게임 3  (0) 2024.06.21
[프로그래머스/C++ 문제 풀이] Lv. 0 - 겹치는 선분의 길이  (0) 2024.06.19
  1. 문제 설명
  2. 제한 사항
  3. 입출력 예
  4. 문제 풀이
'코딩테스트/프로그래머스 (Lv. 0)' 카테고리의 다른 글
  • [프로그래머스/C++ 문제 풀이] Lv. 0 - [PCCE 기출문제] 8번 / 창고 정리
  • [프로그래머스/C++ 문제 풀이] Lv. 0 - 연속된 수의 합
  • [프로그래머스/C++ 문제 풀이] Lv. 0 - 분수의 덧셈
  • [프로그래머스/C++ 문제 풀이] Lv. 0 - 주사위 게임 3
리태s
리태s
게임 클라이언트 프로그래머 직무를 준비하며 공부한 내용을 정리한 블로그입니다.
    반응형
    250x250
  • 리태s
    LeeTaes 공부노트
    리태s
  • 전체
    오늘
    어제
    • Home (165)
      • 프로젝트 (20)
        • Isaac 3D (5)
        • TimelessAdventure (13)
        • FruitsPuzzle (2)
      • Game Programming (25)
        • C# (8)
        • Unity Engine (6)
        • Unreal Engine (8)
        • UE_Multiplayer (3)
      • 코딩테스트 (111)
        • 프로그래머스 (Lv. 0) (27)
        • 프로그래머스 (Lv. 1) (31)
        • 프로그래머스 (Lv. 2) (21)
        • 백준 (Study) (29)
        • 알고리즘 (3)
      • CS지식 (7)
        • 운영체제 (7)
      • 일상 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    unrealengine
    프로세스
    pcce 기출문제
    project t.a develop
    프로젝트
    issac3d
    Summer/Winter Coding
    후기
    Unreal Engine
    프로그래머스
    Algorithm
    청년취업사관학교
    코딩테스트
    unity
    구현
    c#
    fsoftobjectpath
    2019 kakao
    2018 kakao
    dataasset
    delegate
    ai controller
    tsoftobjectptr
    2022 kakao
    fruitspuzzle
    timelessadventure
    백준
    sesac
    C++
    CS지식
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
리태s
[프로그래머스/C++ 문제 풀이] Lv. 0 - 안전 지대

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.