์ด๋ฒ์๋ ๋ง์ ๊ตฌํ์ ์ด๋ ต์ง ์์ DFS ๊ด๋ จ ๋ฌธ์ ์์ง๋ง, ์๊ฐํ๋๋ฐ ์กฐ๊ธ ๋ง์ ๊ธธ์ ๊ฐ์ผํ๋ค. ๊ทธ๋๋ DFS, BFS์ ๋ํ ๊ฐ์ ์กฐ๊ธ์ฉ ์ก์๊ฐ๊ณ ์๋ ๊ฒ ๊ฐ์์ ๋๋ฌด ๊ธฐ์๋ค!
โซ๏ธ ๋ฌธ์
https://www.acmicpc.net/problem/1941
1941๋ฒ: ์๋ฌธ๋ ์น ๊ณต์ฃผ
์ด 25๋ช ์ ์ฌํ์๋ค๋ก ์ด๋ฃจ์ด์ง ์ฌํ์๋ฐ์ 5×5์ ์ ์ฌ๊ฐํ ๊ฒฉ์ ํํ๋ก ์๋ฆฌ๊ฐ ๋ฐฐ์น๋์๊ณ , ์ผ๋ง ์ง๋์ง ์์ ์ด๋ค์๊ณผ ์๋์ฐ์ด๋ผ๋ ๋ ํ์์ด ๋๊ฐ์ ๋ํ๋ด๋ฉฐ ๋ค๋ฅธ ํ์๋ค์ ํ์ด์ก๊ธฐ ์์
www.acmicpc.net
โซ๏ธ ์๊ฐ์ ํ๋ฆ
1๏ธโฃ ์ฒซ๋ฒ์งธ ์๊ฐ
์ผ๋จ ์ฐ๊ฒฐ๋ 7๋ช ์ ์น๊ตฌ๋ค์ ์ฐพ์์ผํ๋ ๊ฒ์ด ์ฐ์ ์ธ ๊ฒ ๊ฐ์๋ค. ๊ทธ๋์ DFS๋ฅผ ์ด์ฉํด์ 7๋ช ์ ์น๊ตฌ๋ค์ ํ์ํ๋ฉด์, ๊ทธ ์น๊ตฌ๋ค์ด S์ธ์ง Y์ธ์ง ํ๋จํ๊ณ , Y๊ฐ 4๋ช ์ ๋์ด๊ฐ๋ ์๊ฐ ํด๋น ํ์์ ์ข ๋ฃํด์ฃผ๋ ๋ฐฑํธ๋ํน ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์ ํ๋ค.
๊ทธ๋์ ์ ๊ทธ๋ฆผ์ ์กฐ๊ธ ํด์ํด๋ณด์๋ฉด, (0,0)์ ์์น๋ถํฐ DFS๋ฅผ ์ด์ฉํด์ ์ฌ๋ฐฉํ์์ ์งํํ๊ณ , ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ฉด์ ์ด๋ํ๊ณ S์ Y์ ๊ฐฏ์๋ฅผ ํ๋จํด์ฃผ๊ณ return๋ ๋ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ false์ฒ๋ฆฌํด์ฃผ๋ฉด์ ๋ค์ ๋ค์ ํ์์ ํ ์ ์๋๋ก ํ๋ค.
โ ์ด ํ์ด๋ก ์งํํ์ง ๋ชปํ๋ ์ด์
๊ณฐ๊ณฐํ ์๊ฐํด๋ณด๋๊น, ํ์๋ค์ ์ ๋ถ! ์ธ์ ํด ์์ผ๋ฉด๋๋ค. ์๋ ๋ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์.
DFS๋ ์ง๊ธ ํ์์ค์ธ ๋ ธ๋๋ก๋ถํฐ ์ํ์ข์ฐ๋ฅผ ์ดํผ๊ณ ์ด๋ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ํ๋ฉด ๊ทธ ์์น์์ ๋ค์ ์ํ์ข์ฐ๋ฅผ ์ดํ๋ค. ์ฐ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ค๊ฐ ์ข ๋ฐฉํฅ์ผ๋ก ๋ค์ ๋๋์๊ฐ๋ ๋์ง๋ง, ์ด๋ฏธ ํ๋ฒ ๊ฑฐ์ณ์จ ๋ ธ๋๋ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๊ฐ ๋์ด์๊ธฐ ๋๋ฌธ์ ๋ค์ ๋์๊ฐ ์์๋ค. ๊ทธ๋์ DFS๋ ๊ฒฐ๊ตญ, ํ ๋ฐฉํฅ, ์ฐ๊ฒฐ๋ ํ๋์ ํ์ดํ ๋ฐฉํฅ์ผ๋ก๋ง ์ด๋ํ ์ ์๋ค. (์๋ค๊ฐ ๋๋์๊ฐ ์ ์๋ค.)
์๋ค๊ฐ ๋๋์๊ฐ๋ DFS๋ก๋ ๊ตฌํ์ด ๊ฐ๋ฅํ๊ธด ํ์ง๋ง, ์ด ๋ฌธ์ ์์๋ ์ด์ฐจํผ ํ๋ฒ countํ ํ์์ ๋ count๋์ง ์์์ผํ๊ธฐ ๋๋ฌธ์ visited๊ฐ ํ์ํ๋ค. ๊ทธ๋์ ๋๋์๊ฐ๊ฒ ๊ตฌํ์ด ์ด๋ ต๋ค๋ ํ๋จ์ด์๋ค.
2๏ธโฃ ๋๋ฒ์งธ ์๊ฐ
๋๋ฒ์งธ๋ก ์๊ฐํ ๊ฒ์, '์์ ํ์'์ ๋จผ์ ์๊ฐํด๋๋ค. ์๋ํ๋ฉด, ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด, ํญ์ ์ ๋ ฅ๊ฐ์ 5x5 ๋ก ์ฃผ์ด์ง๋ค. ๊ทธ๋ผ, ์ฌ๊ธฐ์ 7๋ช ์ ๊ณจ๋ผ๋ด๋๋ฐ์๋ max๊ฐ์ด ์ ํด์ ธ์๋ค. 25๊ฐ์ค 7๊ฐ๋ฅผ ๊ณ ๋ฅด๋ (25C7, combination) ๋งํผ๋ง ํ์ํด์ฃผ๋ฉด ๋๋ค.
์์ ํ์์ ํ๊ธฐ ์ํด์ ๊ฐ์ฅ ์ค์ํ, ์กฐ๊ฑด์ ์ดํด๋ณด๊ณ ์๊ฐ๋ณต์ก๋๊ฐ ์ด๋ป๊ฒ ๋ ์ง ๊ณ ๋ฏผํด๋ดค๋ค. ์ผ๋จ,, 25๊ฐ์์ 7๊ฐ๋ฅผ ๋ฝ์๋ด๋ ๊ฒฝ์ฐ์ ์๋ 48๋ง๊ฐ ์ ๋ ๋๋ค. (๊ณ์ฐ๊ธฐ ๋กํ) ๊ทธ๋ฆฌ๊ณ ๋ฐฑ์ค์์ ์ฃผ์ด์ง ์๊ฐ์ 2์ด. (ํ์ด์ฌ ๊ธฐ์ค์ผ๋ก 2์ด๋ฉด 2์ตํ ๋์๊ฐ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋๊น, ์ผ๋จ 48๋งํ ๋์๊ฐ๋ ๊ฒ์ ์๊ฐ์ ์ผ๋ก ์ฌ์ ๊ฐ ์์ ๊ฒ ๊ฐ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ง๊ธ ๋ด ๋ํผ์ ์, 100๋ง ์ดํ๋ ๋ฌด์กฐ๊ฑด ์ํ์ ๋๋ ค๋ ์๊ด์ด ์๋ค๊ณ ํ๋จํ๊ณ ์๋ค.)
๊ทธ๋์ ์ฌ๊ธฐ ๋ ธ๋์ ํ๊ดํฌ ์ฒ๋ผ ์๊ฐํด๋๋ค. ์ ๋ ๊ฒ ๊ตฌํํด๋ณด์....
๐ 48๋ง๊ฐ ๋จผ์ ๋ง๋ค์ด์ฃผ์
๊ฐ์ฅ ๋จผ์ combination์ ๊ตฌํํด์ฃผ์ด์ผํ๋ค. ์ค์ํํธ๋ ๋ด์ฅ๋์ด์๋ combination ๋ฉ์๋๊ฐ ์๊ธฐ ๋๋ฌธ์,,, ์์ ๋ถํฐ ์ด์ง! ์ฌ๊ท๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์ตํ๋๊ณ ์์๋ค. (์ง๊ธ๋ ๊ตฌํํ๋๋ฐ ์กฐ๊ธ ์ฐธ๊ณ ํใท.ใ ํคใ ํค ์ฐธ๊ณ ๊ธ - https://inuplace.tistory.com/1189
์ด์ฐจํผ 25๊ฐ์ ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋๊น, 0๋ถํฐ 24๊น์ง์ ์ซ์๋ฅผ ํตํด์ ๋ฐฐ์ด์ ๋ง๋ค์๋ค. ์ซ์๋ง ์์ด๋ row์ column ์ซ์๋ฅผ ๊ตฌํ ์ ์๊ธฐ ๋๋ฌธ์ด์๋ค! ๋ณต์กํ๊ฒ (0,0) (0,1),,, ์ด๋ ๊ฒ ์ขํ๊ฐ์ ๊ฐ์ง๊ณ ์กฐํฉ์ ๋ง๋ค์ง ์์๋ค.
๐ ๊ทธ๋ฆฌ๊ณ S์ ๊ฐ์๋ฅผ ํ๋จํด์ฃผ๋ ํจ์ ์๊ฐ
๊ทธ๋ค์ S์ ๊ฐ์๋ฅผ ํ๋จํด์ฃผ๋ ํจ์๋ฅผ ๋ง๋ค์๋ค. ์ด ํจ์๋, combination์ผ๋ก๋ถํฐ ๋์ถ๋ 48๋ง๊ฐ์ ๋ฐฐ์ด์ค ํ๋๋ฅผ ๋ฐ์์์, ๊ทธ ๋ฐฐ์ด ๋ด๋ถ์์ ๊ฐ ์์น์ S์ Y๊ฐ ๋ช๊ฐ์ธ์ง ์ธ์ด์ฃผ์๋ค. S๊ฐ 4๊ฐ๊ฐ ๋์ด๊ฐ๋ ์๊ฐ true๋ฅผ ๋ฆฌํดํด์ฃผ๊ณ Y๊ฐ 4๊ฐ๊ฐ ๋์ด๊ฐ๋ ์๊ฐ False๋ฅผ ๋ฆฌํดํด์ฃผ๋๋ก ๋ง๋ค๋ฉด ๋๋ค๊ณ ํ๋จํ๋ค.
๐ 7๊ฐ๊ฐ ์ฐ๊ฒฐ๋์ด์๋์ง ํ์ธ
7๊ฐ๊ฐ ์ฐ๊ฒฐ๋์ด์๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋๋ฐ ์๊ฐ์ด ์ข ๊ฑธ๋ ธ๋ค. ๋ด๊ฐ ์กฐํฉ์ ๋ง๋ ๋ฐฉ๋ฒ์ด 0๋ถํฐ 24๊น์ง์ ์ซ์๋ก ๋ง๋ค์์ผ๋๊น, ๋๋จธ์ง๊ฐ ๊ฐ๊ฑฐ๋ ๋ชซ์ด ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ๋ฌถ์ด์ ๊ฐ์์ง ํ๋จํ๊ณ ์ฐ๊ฒฐ ์ฌ๋ถ๋ฅผ ํ๋จํ๊ณ ์ ํ๋ค. ๊ทผ๋ฐ,,, ์ด๋ ๊ฒ ์ ์๋๋ค. ๊ทธ๋์ ๋ค๋ฅธ๋ฐฉ๋ฒ์ ์๊ฐํด๋๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ BFS๋ฅผ ํตํด์ ์ธ์ ๋ ธ๋๋ฅผ ์ฐพ์์ฃผ๋ ๋ฐฉ์์ด์๋ค. BFS๊ฐ ์ต๋จ๊ฒฝ๋ก๋ฅผ ์ฐพ์์ค๋ค๊ณ ์๋ ค์ ธ์๊ธด ํ์ง๋ง, ์ฌ์ค ์๊ฐํด๋ณด๋ฉด, BFS๊ฐ ๋์ํ๋ ๋ฐฉ์์ ๋ ์ฌ๋ ค๋ณด๋ฉด, ํ์ฌ ํ์์ค์ธ ๋ ธ๋๋ ์ธ์ ํ ์ ๋ค์ ์ ๋ถ queue์ ๋ฃ์ด์ฃผ๊ณ , queue๋ฅผ ์์งํ ๋๊น์ง ํ์์ ์งํํ๋ค. BFS์ ๋ฃ์ด์ค arr๋ ๊ธธ์ด 7์ง๋ฆฌ ๋ฐฐ์ด์ด๊ณ , 7๊ฐ ๋ชจ๋๊ฐ ์ธ์ ๋์ด์์ด์ผํ๋๊น, ๊ฒฐ๊ตญ ๋์ถ๋ ๋ 7๊ฐ ๋ชจ๋ visited ์ฒ๋ฆฌ๊ฐ ๋์ด์์ผ๋ฉด ๋ชจ๋ ๋ฐฉ๋ฌธํ๋ค๋ ๋ป, ์ฆ ๋ชจ๋ ์ธ์ ํด์ queue์ ํ๋ฒ ๋ค์ด๊ฐ๋ค๊ฐ ๋์๋ค๋ ๋ป์ผ๋ก ํด์ํ ์ ์๋ค!
์ด ๋ชจ๋ ๊ฒ์ ์ฐจ๊ทผ์ฐจ๊ทผ ๊ตฌํํ๋ฉด,, ์ ๋ต์ ๊ตฌํ ์ ์๋ค. ํคํค ์ฌ๋ฐ๋ค ์ด๋ฐ๋ฌธ์ ๋๋ฌด!
โซ๏ธ ์ ๋ต์ฝ๋
import Foundation
var location = [[String]]()
for _ in 0..<5 {
location.append(readLine()!.map{ String($0) })
}
let dx = [-1, 1, 0, 0]
let dy = [0, 0, -1, 1]
func solution() {
// 48๋ง๊ฐ ์กฐํฉ ์์ฑ
let combiArr = combi(arr: Array(stride(from: 0, through: 24, by: 1)), n: 7)
var answer = 0
for c in combiArr {
if checkScnt(arr: c) {
if isConnection(arr: c) {
answer += 1
}
}
}
print(answer)
}
func checkScnt(arr: [Int]) -> Bool {
// ๋ค์(S)๊ฐ 4๋ช
์ด์์ด๋ฉด true
var sCnt = 0
var yCnt = 0
for i in 0..<7 {
if sCnt >= 4 {
return true
} else if yCnt >= 4 {
return false
}
let x = arr[i] / 5
let y = arr[i] % 5
if location[x][y] == "S" {
sCnt += 1
} else if location[x][y] == "Y" {
yCnt += 1
}
}
if sCnt >= 4 {
return true
}
return false
}
func isConnection(arr: [Int]) -> Bool {
var check = Array(repeating: false, count: 7) // arr์ ๋ง์ถฐ์ ์ธ๋ฑ์ค๋ก ๊ตฌ๋ณ
var queue = [(Int, Int)]()
func bfs(index: Int) {
queue.append((arr[index] / 5, arr[index] % 5))
check[index] = true
while !queue.isEmpty {
let temp = queue.removeFirst()
let x = temp.0
let y = temp.1
for i in 0..<4 {
let nx = x + dx[i]
let ny = y + dy[i]
if nx < 0 || ny < 0 || nx >= 5 || ny >= 5 {
continue
}
if arr.contains((nx * 5) + ny), !check[arr.firstIndex(of: (nx * 5) + ny)!] {
check[arr.firstIndex(of: (nx * 5) + ny)!] = true
queue.append((nx, ny))
}
}
}
}
bfs(index: 0)
if check.filter({ $0 == true }).count == 7 {
return true
}
return false
}
func combi(arr: [Int], n: Int) -> [[Int]] {
var combiArr = [[Int]]()
func dfs(index: Int, now: [Int]) {
if now.count == n {
combiArr.append(now)
return
}
for i in index..<arr.count {
dfs(index: i + 1, now: now + [arr[i]])
}
}
dfs(index: 0, now: [])
return combiArr
}
solution()
์ด ๋ฌธ์ ๋ ๋ฌธ์ ์์ ํํธ๊ฐ ์จ๊ฒจ์ ธ์๋๊ฒ ํน์ง์ด์๋ค. ๋ฐ๋ก ์ ๋ ฅ๊ฐ์ด ํญ์ 25๊ฐ๋ผ๋ ๊ฒ์ ํ์ ํ๋ ๊ฒ!!!
'Algorithm > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] (Swift) 2512๋ฒ - ์์ฐ (์ด๋ถํ์, ํ๋ผ๋ฉํธ๋ฆญ ์์น) (0) | 2023.03.17 |
---|---|
[๋ฐฑ์ค] (Swift) 10816๋ฒ - ์ซ์์นด๋2 (์ด๋ถํ์, upper bound, lower bound) (0) | 2023.03.17 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Swift) ๋จ์ด๋ณํ (LV.3) (DFS) (1) | 2023.03.03 |
[๋ฐฑ์ค] (Swift) 3055๋ฒ - ํ์ถ (๊ณจ๋4) (BFS) (0) | 2023.03.03 |
[๋ฐฑ์ค] (Swift) 10026๋ฒ - ์ ๋ก์์ฝ (๊ณจ๋5) (DFS) (0) | 2023.03.03 |