[백준/9082] 지뢰 찾기 - 그리디 (Java)
백준 9082번 지뢰 찾기 문제를 Java로 해결한 풀이입니다. 그리디 알고리즘을 활용하여 앞에서부터 지뢰를 놓을 수 있는지 확인하며 최대 지뢰 개수를 구하는 방법을 설명합니다.
🙋♂️들어가며
이번에 학습할 내용은 그리디 응용버젼이다
예제
boj-9082-지뢰찾기
풀이
↙️ ⬇️ ↘️ 이 방향을 생각해보자 먼저 해당문제는 그리디로 풀 수 있겠다
2가지 경우로 나눠보자
1
2
3
4
1. 지뢰(*)일때 횟수 합산
2-1. 지뢰가 아닐떄 (#) 지뢰를 놓을 수 있는지 검사
2-2. 유효성 검사
*일때는 무조건 cnt++ #라면 앞에서 부터 범위에 맞다면 3가지 방향을 탐색할 수 있도록하고 숫자를 줄여나가며 0이 될시 해당 반복문은 break한다.
testcase_1, testcase_2를 풀어보자
빈칸은 임의로 -라 지정하겠다
빨간색으로 표시한 idx에서 인근 1칸씩 줄일 수 있을 때 차감한다
🙂testcase_1 –> 11122
00122
1
*
00122
1
*-
00122
1
*--
00011
1
*--*
00011
1
*--**
🙂testcase_2 –> 23321
02321
1
*
01221
1
**
00111
1
***
00000
1
****
00000
1
****-
코드
아래 Java 코드는 그리디 관점에서 접근한 핵심 풀이입니다. 입력 조건과 시간·공간 복잡도를 함께 고려하여 불필요한 연산을 줄이는 방향으로 설계했습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*
그리디
*/
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Main {
static char[] block;
static int[] numbers;
static int N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for (int tc = 1; tc < T+1; tc++) {
N = Integer.parseInt(br.readLine());
String num_arr = br.readLine();
block = br.readLine().toCharArray();
numbers = new int[N];
for (int i = 0; i < N; i++) {
numbers[i] = num_arr.charAt(i) - '0';
}
lets_find_maximum_bomb();
}
}
static void lets_find_maximum_bomb() {
int cnt = 0;
for (int i = 0; i < N; i++) {
// 1. 지뢰일 때 놓을 수 있는지 검사
if (block[i] == '*') {
for (int j = i-1; j <= i+1; j++) {
if (j >= 0 && j < N) {
numbers[j]--;
}
}
cnt++;
}
// 2-1. 지뢰가 아닐 때 놓을 수 있는지 검사
else if (block[i] == '#') {
boolean flag = true;
for (int j = i-1; j <= i+1; j++) {
if (j >= 0 && j < N && numbers[j] <= 0) {
flag = false;
break;
}
}
// 2-2. 유효성 검사
if (flag) {
for (int j = i-1; j <= i+1; j++) {
if (j >= 0 && j < N) {
numbers[j]--;
}
}
block[i] = '*';
cnt++;
}
}
}
// 3. 출력
System.out.println(cnt);
}
}
위 구현은 [백준/Java] 9082번 지뢰 찾기 풀이 - 구현 알고리즘의 제약 조건을 만족하도록 자료구조 선택과 반복 범위를 최적화한 결과입니다.
This post is licensed under CC BY 4.0 by the author.
