문제/백준

[백준] 9082 지뢰찾기 - Java

icodesiuuuu 2024. 10. 17. 01:00

문제

https://www.acmicpc.net/problem/9082


 

문제 개요

지뢰찾기 게임은 2×N 배열에 숨겨져 있는 지뢰를 찾는 게임입니다. 배열의 첫 번째 줄에는 각 블록 주위에 있는 지뢰의 개수를 나타내는 숫자가, 두 번째 줄에는 지뢰가 숨겨져 있는 위치를 나타내는 *와 숨겨진 블록을 나타내는 #이 있습니다. 주어진 배열에서 지뢰의 총 개수를 찾는 문제입니다.

 

접근 방법

단순 최댓값을 구하는 문제이기 때문에 정확한 위치는 배제하고 생각해 보았습니다.

초기 값 설정: 입력받은 힌트 배열을 사용하여 지뢰의 개수를 계산합니다.
지뢰 찾기 로직:

  1. 배열의 각 요소를 순회하며, 주변 블록의 힌트를 확인합니다.
  2. 지뢰가 있을 수 있는 위치에서 힌트 값을 감소시키며 지뢰의 개수를 세어갑니다.

첫 번째 칸에서 지뢰가 양쪽 다 존재할 수 있으면 1씩 감소시키고 지뢰 횟수를 1 증가

 

마지막 칸에서 지뢰가 양쪽 다 존재할 수 있으면 1씩 감소시키고 지뢰 횟수를 1 증가

 

중간에 있는 칸일 경우 나를 포함한 좌,우 모두 지뢰가 존재할 수 있으면 1씩 감소시키고 지뢰 횟수 1증가
반복하여 위 세 가지 조건이 해당하지 않는 경우 지뢰 횟수 출력

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine()); // 테스트 케이스 수

        for (int t = 0; t < T; t++) {
            int N = Integer.parseInt(br.readLine()); // 배열 크기
            int[] hint = makeHint(br.readLine().split("")); // 숫자 배열 생성
            String map = br.readLine();

            int mineCount = find(hint); // 지뢰 찾기
            System.out.println(mineCount); // 결과 출력
        }
    }

    private static int find(int[] hint) {
        int answer = 0;
        // 각 지점에 대해 반복
        for (int i = 0; i < hint.length; i++) {
            // 첫 번째 칸의 경우
            if (i == 0) {
                // 현재 칸과 다음 칸이 모두 지뢰 후보인 경우
                if (hint[i] != 0 && hint[i + 1] != 0) {
                    hint[i]--; // 현재 칸 감소
                    hint[i + 1]--; // 다음 칸 감소
                    answer++; // 지뢰 카운트 증가
                }
                // 마지막 칸의 경우
            } else if (i == hint.length - 1) {
                // 현재 칸과 이전 칸이 모두 지뢰 후보인 경우
                if (hint[i - 1] != 0 && hint[i] != 0) {
                    hint[i]--; // 현재 칸 감소
                    hint[i - 1]--; // 이전 칸 감소
                    answer++; // 지뢰 카운트 증가
                }
                // 중간 칸의 경우
            } else {
                // 좌, 우 모두 지뢰 후보인 경우
                if (hint[i - 1] != 0 && hint[i] != 0 && hint[i + 1] != 0) {
                    hint[i - 1]--; // 왼쪽 칸 감소
                    hint[i]--; // 현재 칸 감소
                    hint[i + 1]--; // 오른쪽 칸 감소
                    answer++; // 지뢰 카운트 증가
                }
            }
        }
        return answer;
    }

    private static int[] makeHint(String[] arr) {
        int[] hint = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            hint[i] = Integer.parseInt(arr[i]); // 문자열을 정수로 변환
        }
        return hint.clone(); // 배열 복사 후 반환
    }
}

'문제 > 백준' 카테고리의 다른 글

[백준] 7682 틱택토 - Java  (0) 2024.10.25
[백준] 3190 뱀 - Java  (1) 2024.10.24
[백준] 1094 막대기 - Java  (0) 2024.10.23
[백준] 1018 체스판 다시 칠하기 - Java  (0) 2024.10.23
[백준] 12919 A와 B 2 - Java  (1) 2024.09.22