[ํ๋ก๊ทธ๋๋จธ์ค] ํ๋ ์ฆ4๋ธ๋ก
์ด ๋ฌธ์ ๋ ์ต๊ทผ์ ๋ค์ด๋ฒ ๋ถ์คํธ ์บ ํ 2์ฐจ ์ฝ๋ฉ ํ ์คํธ๋ฅผ ์ค๋นํ๊ธฐ ์ํด ๊ตฌํ ๋ฌธ์ ๋ฅผ ์ฐพ์๋ณด๋ ์ค ํ๋์ธ "ํ๋ ์ฆ 4๋ธ๋ก" ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๊ฒ ๋์์ต๋๋ค. 1์ฐจ ํฉ๊ฒฉ ๋ฉ์ผ์ ๋ฐ์์ ๋ ๋น์์ 2๋ฐ 3์ผ ๋์ ๋์ ํ๋ จ ์ค์ด์๊ธฐ ๋๋ฌธ์ ํด๋ํฐ์ผ๋ก ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด ๋ฉ๋ชจ์ฅ์ ์ฌ์ฉํ์ฌ ์๋์ฝ๋๋ฅผ ์์ฑํ๊ณ ์๊ฐ์ ์ ๋ฆฌํด ๋ ๋ฌธ์ ์์ต๋๋ค.
์ด๋ฒ ์ฝ๋๋ ํ๋์ฉ ์ค๋ช ํ๋ฉด ๋๋ฌด ๊ธธ์ด์ง๊ณ ๊ฐ๋ ์ฑ์ด ์ข์ง ์์ ๊ฑฐ ๊ฐ์ ์ต๋ํ ์ฝ๋ ์์ ์ฝ๋์ ์ญํ ์ ์ ์ด๋ณด๊ฒ ๋์์ต๋๋ค.
1. ๋ฌธ์ ๋งํฌ
https://school.programmers.co.kr/learn/courses/30/lessons/17679
2. ์ฝ๋
func solution(_ m:Int, _ n:Int, _ board:[String]) -> Int {
struct Tuple: Hashable{ //๋ธ๋ก์ ์ง์ฐ๊ธฐ ์ํด ์์น ๊ฐ
let x : Int
let y : Int
}
var lineUp : [[String]] = [] // ๋ค์ด์ค๋ ๊ฐ์ 2์ฐจ์ ๋ฐฐ์ด ๋ณด๋ํ์ผ๋ก ๋ง๋ฌ
var blockIndex = Set<Tuple>() // ์ ๊ฑฐํด์ผํ๋ ๋ธ๋ก ์์น ์ค๋ณต ์๋๊ฒ ์ ์ฅ
var possible : Bool = true // 4๋ฌถ์ ๋ธ๋ก์ด ์กด์ฌํ๋ค๋ฉด ํ๋ก์ธ์ค ์งํ
var result : Int = 0 // ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ
// MARK: lineUP ๊ตฌ์ฑ
/// 2์ฐจ์ ๋ฐฐ์ด์ผ๋ก ๋ณด๋ํ ๊ตฌ์ฑ
for j in Array(board){
var temp : [String] = []
for k in j{
temp.append(String(k))
}
lineUp.append(temp)
}
// MARK: 4๋ฌถ์ ๋ธ๋ก ์ฐพ๊ธฐ
func findBlockIndex(){
for i in 0..<lineUp.count{
for j in 0..<lineUp[i].count{
if lineUp[i][j] == "0"{ // 0์ ๋น์นธ์ด๋ฏ๋ก checkingํ ํ์ ์์ด ํจ์ค
continue
}
checking(x: i, y: j, element: lineUp[i][j]) // ๋ณด๋ํ ํ๋์ฉ ์ ๋ถ ํ์
}
}
// blockIndex.isEmpty๊ฐ ๋น์ด์๋ค๋ ๋ป์ ์ด์ ๋ ์ด์ 4๋ฌถ์ ์์๊ฐ ์์ด while๋ฌธ์ ์ข
๋ฃํด๋ ๋จ
if blockIndex.isEmpty{
possible = false // while ๋๊ธฐ
}
}
// MARK: 4๋ฌถ์ ํ์ธ
/// ์งํํ๊ณ ์๋ ์์น์์ ์ค๋ฅธ์ชฝ,์๋, ๋๊ฐ์ ๊ฐ์ด ๊ฐ์ ์์์ธ์ง ํ์ธ
func checking(x: Int, y: Int, element: String) {
let dx = [0,1,1]
let dy = [1,0,1]
for i in 0..<3{ //3๋ฒ์ ํตํด ์ค๋ฅธ์ชฝ,์๋,๋๊ฐ์ ํ์
if isValid(x: x+dx[i], y: y+dy[i]){
// ํ์ํ๋ ์์น ๊ฐ์ ์์๊ฐ ์ ๋ฌ๋ฐ์ element์ด๋ ๋ค๋ฅผ์ return
if lineUp[x+dx[i]][y+dy[i]] != element{
return
}
}else{ //๋ฒ์๋ฅผ ๋ฒ์ด๋๋ return
return
}
}
possible = true //while๋ฌธ ๋ฐ๋ณตํ๊ธฐ ์ํด true
blockIndex.insert(Tuple(x: x, y: y)) //์ ๋ฌ ๋ฐ์ x,y๊ฐ ์ ๊ฑฐ๋ฅผ ํ blockIndex์ ์ ์ฅ
for i in 0..<3{
if isValid(x: x+dx[i], y: y+dy[i]){
blockIndex.insert(Tuple(x: x+dx[i], y: y+dy[i])) // ํ์ํ ๊ฐ๋ ์ ์ฅ
}
}
return //๋ค์ ์์๋ก ์งํ์ ์ํด
}
// MARK: ๋ฐฐ์ด ๋ฒ์ ํ์ธ
func isValid(x: Int, y: Int) -> Bool{
// ๋ฒ์์์ ์๋ค๋ฉด true, ์๋์ false
if x < m && y < n {
return true
}
return false
}
// MARK: 4๋ฌถ์ ์์ ์ง์ฐ๊ธฐ
func removeBlock(){
// ์ ์ฅํด๋ ๋ธ๋ก ์ธ๋ฑ์ค ๊ฐ์
for i in blockIndex{
lineUp[i.x][i.y] = "0" //์ง์์ผ ํ๋ ๋ธ๋ก ๊ฐ "0"์ผ๋ก ๋ฐ๊พธ๊ธฐ
}
result += blockIndex.count //๋งคํ๋ง๋ค ์ง์ด ๋ธ๋ก ์ result์ ์ ์ฅ
blockIndex = [] //๋งคํ๋ง๋ค ํ๋จํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๊ธฐํ
}
// MARK: ๋ณด๋ํ ๋ค์ ๋ง๋ค๊ธฐ
func rebuildingBlock(){
// ๋ณด๋ํ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ๊ฑฐ๊ฟ๋ก ์กฐํํ์ฌ ๋น์ด์๋ ๋ถ๋ถ ๋ฐ์ผ๋ก ๋ด๋ฆฌ๊ธฐ
for i in stride(from: lineUp.count-1, through: 0, by: -1){
for j in stride(from: lineUp[i].count-1, through: 0, by: -1){
if lineUp[i][j] != "0"{ // ํ์ธํ๊ณ ์๋ ์์์ ๊ฐ์ด 0์ด ์๋๋ผ๋ฉด ํ์ธํ๊ธฐ
movingDownBlock(x: i, y: j)
}
}
}
}
// MARK: ๋ธ๋ก ์๋๋ก ๋ด๋ฆฌ๊ธฐ
func movingDownBlock(x: Int, y:Int){
// ์๋๋ก ๋ด๋ฆฌ๊ธฐ ๋๋ฌธ์ x+1 ๋ฒ์๊ฐ ๊ฐ๋ฅํ์ง ํ์ธ
if isValid(x: x+1, y: y){
if lineUp[x+1][y] == "0"{ // ๋ฐ์ ์๋ ์นธ์ด "0" -> ๋น์ด์๋ฏ๋ก
lineUp[x+1][y] = lineUp[x][y] //๋ฐ์ ์นธ์ ์ง๊ธ lineUp[x][y] ๊ฐ ๋ฃ๊ธฐ
lineUp[x][y] = "0" //lineUp[x][y] ๊ฐ์ ๋น์นธ์ผ๋ก ๋ฐ๊พธ๊ธฐ
movingDownBlock(x: x+1, y: y) // ์ฌ๊ท๋ฅผ ํตํด ๋ ๋ฐ์ผ๋ก ๋ด๋ ค๊ฐ ์ ์๋์ง ํ์ธ
}
}
}
// ๋ฐ๋ณต์ ํตํด 1. 4๋ฌถ์ ์ฐพ์ ์์น ์ธ๋ฑ์ค ์ ์ฅ 2. ์ ์ฅํด๋ ์์น๊ฐ ๋ธ๋ก ์ง์ฐ๊ธฐ 3. ๋ธ๋ก ์ฌ์ ๋น -> 4๋ฌถ์ ์์ ๋๊น์ง ๋ฐ๋ณต
while possible{
findBlockIndex()
removeBlock()
rebuildingBlock()
}
return result
}
3. ์ฝ๋ ์ค๋ช
์ฒ์์๋ 4๊ฐ์ ๋ธ๋ก์ ์ด๋ป๊ฒ ์ฐพ์ ์ ์์๊น ๊ณ ๋ฏผํ๋๋ฐ, ๋ณด๋๋ฅผ 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ง๋ค์ด ๊ธธ ์ฐพ๊ธฐ์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ์ฌ ํ์ธํ์ต๋๋ค. ์ค๋ณต๋ ๊ฐ์ Set์ ์ด์ฉํ์ฌ ์ ์ธํ์ต๋๋ค.
๋ค์์ผ๋ก๋ ๋ธ๋ก์ ์ ๊ฑฐํ๊ณ ์๋๋ก ๋ด๋ฆฌ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณ ๋ฏผํ์ต๋๋ค. 2์ฐจ์ ๋ฐฐ์ด์ ๋ธ๋ก์ ๋๋ถ๋ถ ์ฑ์์ ธ ์๊ธฐ ๋๋ฌธ์, ๋ค์์๋ถํฐ ํ์ํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ผ ๊ฒ์ด๋ผ ์๊ฐํ์ต๋๋ค. ๊ทธ๋์ x ๊ฐ๋ง ๊ณ ์ ๋ ์ํ์์ -1์ฉ ๋ด๋ ธ์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก๋ 4๊ฐ์ ๋ธ๋ก์ด ์๋ ๋์์๋ง ๊ณ์ ์งํํด์ผ ํ๋๋ฐ, ๊ฐ ํ์ด ๋๋ ๋๋ง๋ค ์๋ก์ด ๋ณด๋ํ์ด ์๊ธฐ๊ธฐ ๋๋ฌธ์ ์ด๋ป๊ฒ ๋๊น์ง ํ์ธํ ์ ์์๊น ๊ณ ๋ฏผํ์ต๋๋ค. ์ด ๋ถ๋ถ์์ blockIndex.isEmpty๋ฅผ ์ด์ฉํ์ฌ while๋ฌธ์ ์กฐ๊ฑด์ ์ปจํธ๋กคํ์ต๋๋ค.
์ด๋ฒ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉฐ ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ ๋ฐํ๊ฐ์ ๊ณ ๋ คํ๋ฉฐ ๋จ๊ณ์ ์ผ๋ก ๋๋์ด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์์ต๋๋ค. ์ด ๊ณผ์ ์์ ์ฝ๋๋ฅผ ์กฐ๋ฆฝํ๋ ๋๋์ด ๋ค์๊ณ , ๊ฐ๋ ์ฑ์ด ์ข์์ง ๊ฒ ๊ฐ์ ๋ ๊ณ ์ฒ๋ผ ์กฐ๋ฆฝํ๋ ๋๋์ด์์ต๋๋ค.