boj-2630
๋ฌธ์ ํ์ด๋ ์ ํ์
์ ์ฝ๋๋ฅผ ์ข ๋ ๋ณด๊ธฐ ์ข๊ฒ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์๋ ค๋๋ฆด๊ฒ์.
1. ์
๋ ฅ ์ฒ๋ฆฌ && ๋ณ์ ๋ค์ด๋ฐ
let N = Int(readLine()!)!
var paper: [[Int]] = []
for _ in 0..<N {
let line = readLine()!.split(separator: " ").map { Int($0)! }
paper.append(line)
}
- arr์ด๋ผ๋ ๋ฐฐ์ด๋ช
์ ๋์ค์ ๋ฐฐ์ด์ด ๋ง์์ง๋ฉด ํ์
ํ๊ธฐ ํ๋ค ์ ์์ด์.
- ๊ทธ๋์ ํ์์ ์
๋ ฅ๊ฐ์ ์ ์ฅํ๋ ๋ฐฐ์ด๋ช
์ ์ด๋ป๊ฒ ์ง์์ง ๊ณ ๋ฏผํ๋ ๊ฒ ์ธ ๋ฐ ์์ด ๋ณด์ด์ง๋ง, ๋๋ฆ ์ ์ฉํฉ๋๋ค.
// ์นด์ดํธ ๋ณ์๋ช
var whiteCount = 0
var blueCount = 0
// ์์
let WHITE = 0
let BLUE = 1
- 0๊ณผ 1์ ์ฌ์ฉํด๋ ์ข์ง๋ง, ์์ ์ ์ธํด๋ณด๋ ๊ฒ๋ ๋์์ง ์์ต๋๋ค.
- ๊ทผ๋ฐ ์ ๋ ๊ท์ฐฎ์์ 0, 1 ์ธ ๋ ๋ง์์.
2. ๋ก์ง
๐ก As-is
func divide(_ x: Int, _ y: Int, _ size: Int){
if check(x, y, size){
if arr[x][y] == 0{
white += 1
}
else {
blue += 1
}
}
else {
let sx = [ x, x, x + size/2, x + size/2 ]
let sy = [y, y + size/2, y, y + size/2 ]
for i in 0..<4{
divide(sx[i], sy[i], size/2)
}
}
}
func check(_ x: Int, _ y: Int, _ size: Int) -> Bool{
let color = arr[x][y]
for i in x..<(x + size){
for j in y..<(y + size){
if arr[i][j] != color{
return false
}
}
}
return true
}
- check๋ผ๋ ํจ์๊ฐ ์ ํํ ๋ญ ํ์ธํ๋ ๊ฑด์ง ์ดํดํ๋ ค๋ฉด ์ฝ๋๋ฅผ ๋ค ์ฝ์ด๋ด์ผ ํจ.
arr[x][y] == 0
์ด ์์ฌํ๋ ๋ฐ๊ฐ ๋ญ์ง ๋ช
ํํ์ง ์์
- ํ ์ ์๋ค๋ฉด ๋ฐ๋ณต๋ฌธ์ ๋ฐ๋ณต ๋ณ์๊ฐ ๋ค์ด๊ฐ ์ ํต์ ์ธ for๋ฌธ ๋ณด๋ค๋
for-each
๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ ์ข์ต๋๋ค. (์ง๊ด์ )
๐ก To-be
func divideAndConquer(_ y: Int, _ x: Int, _ size: Int) {
if isSingleColor(x, y, size) {
let color = paper[x][y]
color == WHITE ? (whiteCount += 1) : (blueCount += 1)
} else {
let halfSize = size / 2
let nextCoords = [(y, x), (y + halfSize, x), (y, x + halfSize), (y + halfSize, x + halfSize)]
for (ny, nx) in nextCoords {
divideAndConquer(ny, nx, halfSize)
}
}
}
func isSingleColor(_ x: Int, _ y: Int, _ size: Int) -> Bool {
let color = paper[x][y]
for i in x..<x + size {
for j in y..<y + size {
if paper[i][j] != color {
return false
}
}
}
return true
}
divideAndConquer(0, 0, N)
print(whiteCount)
print(blueCount)
- ๋ค์ด๋ฐ์ ๋ณด๋ค ์ง๊ด์ ์ผ๋ก ๋ณด์ด๊ฒ ๋ฐ๊ฟจ์ต๋๋ค.
- for-each๋ฌธ์ ์ฌ์ฉํ๊ธฐ ์ํด์ sx, sy ๋ฒกํฐ ๋ฐฐ์ด์ nextCoords ์์ผ๋ก ๋ฌถ์ด๋ฒ๋ ธ์ต๋๋ค.
์ ๊ฐ ์ค์ํํธ๋ฅผ ์ ๋ชฐ๋ผ์ ์ฌ๊ธฐ์ ๊ธฐ ์ฐพ์๋ณด๊ณ ์ฌ์ฉํ ๊ฑฐ๋ผ ์ค์ ์คํ์ด ์ ๋ ์๋ ์์ด์. ์ฐธ๊ณ ๋ก๋ง ๋ด์ฃผ์ธ์. ๐ฅฒ