Skip to content

Commit a54d730

Browse files
committed
[Gold IV] Title: 지뢰찾기, Time: 8 ms, Memory: 69240 KB -BaekjoonHub
1 parent 6c2ced0 commit a54d730

2 files changed

Lines changed: 199 additions & 0 deletions

File tree

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
# [Gold IV] 지뢰찾기 - 2140
2+
3+
[문제 링크](https://www.acmicpc.net/problem/2140)
4+
5+
### 성능 요약
6+
7+
메모리: 69240 KB, 시간: 8 ms
8+
9+
### 분류
10+
11+
구현, 그리디 알고리즘
12+
13+
### 제출 일자
14+
15+
2025년 8월 15일 00:08:10
16+
17+
### 문제 설명
18+
19+
<p>지뢰찾기는 N×N에서 이뤄지는 게임이다. 보드의 곳곳에는 몇 개의 지뢰가 숨겨져 있고, 지뢰가 없는 칸에는 그 칸과 인접(상하좌우 및 대각선)해 있는 8개의 칸들에 몇 개의 지뢰가 숨겨져 있는지에 대한 정보가 주어진다. 게이머는 게임을 진행하면서 보드의 칸을 하나씩 열게 된다. 만약 그 칸에 지뢰가 있다면 게임이 끝나고, 없는 경우에는 그 칸에 적혀있는 숫자, 즉 그 칸과 인접해 있는 8개의 칸들 중 몇 개의 칸에 지뢰가 있는지를 알 수 있게 된다.</p>
20+
21+
<p>이 문제는 보드의 테두리가 모두 열려있고, 그 외는 모두 닫혀있는 상태에서 시작한다. 예를 들어 다음과 같은 경우를 보자.</p>
22+
23+
<table class="table table-bordered" style="width:25%">
24+
<tbody>
25+
<tr>
26+
<td style="width:5%">1</td>
27+
<td style="width:5%">1</td>
28+
<td style="width:5%">1</td>
29+
<td style="width:5%">0</td>
30+
<td style="width:5%">0</td>
31+
</tr>
32+
<tr>
33+
<td>2</td>
34+
<td>#</td>
35+
<td>#</td>
36+
<td>#</td>
37+
<td>1</td>
38+
</tr>
39+
<tr>
40+
<td>3</td>
41+
<td>#</td>
42+
<td>#</td>
43+
<td>#</td>
44+
<td>1</td>
45+
</tr>
46+
<tr>
47+
<td>2</td>
48+
<td>#</td>
49+
<td>#</td>
50+
<td>#</td>
51+
<td>1</td>
52+
</tr>
53+
<tr>
54+
<td>1</td>
55+
<td>2</td>
56+
<td>2</td>
57+
<td>1</td>
58+
<td>0</td>
59+
</tr>
60+
</tbody>
61+
</table>
62+
63+
<p>#는 닫혀있는 칸을 나타낸다. 이러한 보드가 주어졌을 때, 닫혀있는 칸들 중 최대 몇 개의 칸에 지뢰가 묻혀있는지 알아내는 프로그램을 작성하시오. 위의 예와 같은 경우에는 다음과 같이 6개의 지뢰가 묻혀있을 수 있다.</p>
64+
65+
<table class="table table-bordered" style="width:25%">
66+
<tbody>
67+
<tr>
68+
<td style="width:5%">1</td>
69+
<td style="width:5%">1</td>
70+
<td style="width:5%">1</td>
71+
<td style="width:5%">0</td>
72+
<td style="width:5%">0</td>
73+
</tr>
74+
<tr>
75+
<td>2</td>
76+
<td>*</td>
77+
<td> </td>
78+
<td> </td>
79+
<td>1</td>
80+
</tr>
81+
<tr>
82+
<td>3</td>
83+
<td>*</td>
84+
<td>*</td>
85+
<td>*</td>
86+
<td>1</td>
87+
</tr>
88+
<tr>
89+
<td>2</td>
90+
<td>*</td>
91+
<td>*</td>
92+
<td> </td>
93+
<td>1</td>
94+
</tr>
95+
<tr>
96+
<td>1</td>
97+
<td>2</td>
98+
<td>2</td>
99+
<td>1</td>
100+
<td>0</td>
101+
</tr>
102+
</tbody>
103+
</table>
104+
105+
### 입력
106+
107+
<p>첫째 줄에 N(1≤N≤100)이 주어진다. 다음 N개의 줄에는 N개의 문자가 공백 없이 주어지는데, 이는 게임 보드를 의미한다.</p>
108+
109+
### 출력
110+
111+
<p>첫째 줄에 묻혀있을 수 있는 지뢰의 최대 개수를 출력한다.</p>
112+
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
let n = Int(readLine()!)!
2+
3+
var answer = 0
4+
var mineMap = [[String]](repeating: [String](repeating: " ", count: n), count: n)
5+
var countMap = [[Int]](repeating: [Int](repeating: -1, count: n), count: n)
6+
7+
for i in 0..<n {
8+
let line = readLine()!.map { String($0) }
9+
for j in line.indices {
10+
if line[j] == "#" {
11+
mineMap[i][j] = "#"
12+
continue
13+
}
14+
if let number = Int(line[j]) {
15+
countMap[i][j] = number
16+
continue
17+
}
18+
}
19+
}
20+
21+
if !(1...2).contains(n) {
22+
for i in stride(from: 1, to: n-1, by: n-3 > 0 ? n-3 : 1) {
23+
for j in 1..<n-1 {
24+
if mineMap[i][j] == "#" {
25+
var flag = true
26+
for row in stride(from: i - 1, through: i + 1, by: 1) where row >= 0 && row < n {
27+
for col in stride(from: j - 1, through: j + 1, by: 1) where col >= 0 && col < n {
28+
if countMap[row][col] == -1 { continue }
29+
if countMap[row][col] <= 0 {
30+
flag = false
31+
break
32+
}
33+
}
34+
if flag == false { break }
35+
}
36+
guard flag else {
37+
mineMap[i][j] = " "
38+
continue
39+
}
40+
for row in stride(from: i-1, through: i+1, by: 1) where row >= 0 && row < n {
41+
for col in stride(from: j-1, through: j+1, by: 1) where col >= 0 && col < n {
42+
if countMap[row][col] == -1 { continue }
43+
countMap[row][col] = countMap[row][col] - 1 >= 0 ? countMap[row][col] - 1 : 0
44+
}
45+
}
46+
answer += 1
47+
mineMap[i][j] = " "
48+
}
49+
}
50+
}
51+
for i in stride(from: 1, to: n - 1, by: n-3 > 0 ? n-3 : 1) {
52+
for j in 1..<n - 1 {
53+
if mineMap[j][i] == "#" {
54+
var flag = true
55+
for row in stride(from: j - 1, through: j + 1, by: 1) where row >= 0 && row < n {
56+
for col in stride(from: i - 1, through: i + 1, by: 1) where col >= 0 && col < n {
57+
if countMap[row][col] == -1 { continue }
58+
if countMap[row][col] <= 0 {
59+
flag = false
60+
break
61+
}
62+
}
63+
if flag == false {
64+
mineMap[j][i] = " "
65+
break
66+
}
67+
}
68+
guard flag else { continue }
69+
for row in stride(from: j - 1, through: j + 1, by: 1) where row >= 0 && row < n {
70+
for col in stride(from: i - 1, through: i + 1, by: 1) where col >= 0 && col < n {
71+
if countMap[row][col] == -1 { continue }
72+
countMap[row][col] = countMap[row][col] - 1 >= 0 ? countMap[row][col] - 1 : 0
73+
}
74+
}
75+
answer += 1
76+
mineMap[j][i] = " "
77+
}
78+
}
79+
}
80+
for i in 0..<n {
81+
for j in 0..<n {
82+
if mineMap[i][j] == "#" { answer += 1}
83+
}
84+
}
85+
}
86+
87+
print(answer)

0 commit comments

Comments
 (0)