Skip to content

Commit 4701d01

Browse files
committed
[Gold IV] Title: 스도쿠, Time: 1784 ms, Memory: 69112 KB -BaekjoonHub
1 parent df39594 commit 4701d01

2 files changed

Lines changed: 114 additions & 0 deletions

File tree

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# [Gold IV] 스도쿠 - 2239
2+
3+
[문제 링크](https://www.acmicpc.net/problem/2239)
4+
5+
### 성능 요약
6+
7+
메모리: 69112 KB, 시간: 1784 ms
8+
9+
### 분류
10+
11+
구현, 백트래킹
12+
13+
### 제출 일자
14+
15+
2025년 7월 8일 15:33:18
16+
17+
### 문제 설명
18+
19+
<p>스도쿠는 매우 간단한 숫자 퍼즐이다. 9×9 크기의 보드가 있을 때, 각 행과 각 열, 그리고 9개의 3×3 크기의 보드에 1부터 9까지의 숫자가 중복 없이 나타나도록 보드를 채우면 된다. 예를 들어 다음을 보자.</p>
20+
21+
<p><img alt="" height="337" src="https://www.acmicpc.net/JudgeOnline/upload/201008/sdk.png" width="341"></p>
22+
23+
<p>위 그림은 참 잘도 스도쿠 퍼즐을 푼 경우이다. 각 행에 1부터 9까지의 숫자가 중복 없이 나오고, 각 열에 1부터 9까지의 숫자가 중복 없이 나오고, 각 3×3짜리 사각형(9개이며, 위에서 색깔로 표시되었다)에 1부터 9까지의 숫자가 중복 없이 나오기 때문이다.</p>
24+
25+
<p>하다 만 스도쿠 퍼즐이 주어졌을 때, 마저 끝내는 프로그램을 작성하시오.</p>
26+
27+
### 입력
28+
29+
<p>9개의 줄에 9개의 숫자로 보드가 입력된다. 아직 숫자가 채워지지 않은 칸에는 0이 주어진다.</p>
30+
31+
### 출력
32+
33+
<p>9개의 줄에 9개의 숫자로 답을 출력한다. 답이 여러 개 있다면 그 중 사전식으로 앞서는 것을 출력한다. 즉, 81자리의 수가 제일 작은 경우를 출력한다.</p>
34+
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
struct Point {
2+
let r: Int
3+
let c: Int
4+
}
5+
6+
var grid = [[Int]]()
7+
var rowSet = [Set<Int>]()
8+
var colSet = [Set<Int>](repeating: Set<Int>(), count: 9)
9+
10+
var emptyPoints = [Point]()
11+
12+
for i in 0..<9 {
13+
let line = readLine()!.map { Int(String($0))! }
14+
15+
for j in line.indices {
16+
if line[j] == 0 { emptyPoints.append(Point(r: i, c: j)) }
17+
}
18+
grid.append(line)
19+
rowSet.append(Set(line))
20+
}
21+
22+
for i in 0..<9 {
23+
for j: Int in 0..<9 {
24+
colSet[j].insert(grid[i][j])
25+
}
26+
}
27+
28+
var isVisited = [Bool](repeating: false, count: emptyPoints.count)
29+
30+
func isUniqueInSetcion(_ r: Int, _ c: Int, _ v: Int) -> Bool {
31+
let sr = r / 3
32+
let sc = c / 3
33+
34+
for i in sr*3..<sr*3+3 {
35+
for j in sc*3..<sc*3+3 {
36+
if grid[i][j] == v {
37+
return false
38+
}
39+
}
40+
}
41+
return true
42+
}
43+
44+
func backtracking(_ depth: Int) -> Bool {
45+
if depth == emptyPoints.count {
46+
return true
47+
}
48+
49+
let point = emptyPoints[depth]
50+
51+
for number in 1...9 {
52+
if rowSet[point.r].contains(number) { continue }
53+
if colSet[point.c].contains(number) { continue }
54+
if !isUniqueInSetcion(point.r, point.c, number) { continue }
55+
56+
rowSet[point.r].insert(number)
57+
colSet[point.c].insert(number)
58+
grid[point.r][point.c] = number
59+
60+
if backtracking(depth + 1) { return true }
61+
62+
grid[point.r][point.c] = 0
63+
rowSet[point.r].remove(number)
64+
colSet[point.c].remove(number)
65+
}
66+
return false
67+
}
68+
69+
_=backtracking(0)
70+
71+
var answer = ""
72+
73+
for r in 0..<9 {
74+
for c in 0..<9 {
75+
answer.write("\(grid[r][c])")
76+
}
77+
answer.write("\n")
78+
}
79+
80+
print(answer)

0 commit comments

Comments
 (0)