-
[ํ๋ก๊ทธ๋๋จธ์ค] ํ๋ ์ฆ4๋ธ๋ก์๋ฃ๊ตฌ์กฐ & ์๊ณ ๋ฆฌ์ฆ 2023. 6. 25. 22:54
์ด ๋ฌธ์ ๋ ์ต๊ทผ์ ๋ค์ด๋ฒ ๋ถ์คํธ ์บ ํ 2์ฐจ ์ฝ๋ฉ ํ ์คํธ๋ฅผ ์ค๋นํ๊ธฐ ์ํด ๊ตฌํ ๋ฌธ์ ๋ฅผ ์ฐพ์๋ณด๋ ์ค ํ๋์ธ "ํ๋ ์ฆ 4๋ธ๋ก" ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๊ฒ ๋์์ต๋๋ค. 1์ฐจ ํฉ๊ฒฉ ๋ฉ์ผ์ ๋ฐ์์ ๋ ๋น์์ 2๋ฐ 3์ผ ๋์ ๋์ ํ๋ จ ์ค์ด์๊ธฐ ๋๋ฌธ์ ํด๋ํฐ์ผ๋ก ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด ๋ฉ๋ชจ์ฅ์ ์ฌ์ฉํ์ฌ ์๋์ฝ๋๋ฅผ ์์ฑํ๊ณ ์๊ฐ์ ์ ๋ฆฌํด ๋ ๋ฌธ์ ์์ต๋๋ค.
์ด๋ฒ ์ฝ๋๋ ํ๋์ฉ ์ค๋ช ํ๋ฉด ๋๋ฌด ๊ธธ์ด์ง๊ณ ๊ฐ๋ ์ฑ์ด ์ข์ง ์์ ๊ฑฐ ๊ฐ์ ์ต๋ํ ์ฝ๋ ์์ ์ฝ๋์ ์ญํ ์ ์ ์ด๋ณด๊ฒ ๋์์ต๋๋ค.
1. ๋ฌธ์ ๋งํฌ
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
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๋ฌธ์ ์กฐ๊ฑด์ ์ปจํธ๋กคํ์ต๋๋ค.
์ด๋ฒ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉฐ ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ ๋ฐํ๊ฐ์ ๊ณ ๋ คํ๋ฉฐ ๋จ๊ณ์ ์ผ๋ก ๋๋์ด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์์ต๋๋ค. ์ด ๊ณผ์ ์์ ์ฝ๋๋ฅผ ์กฐ๋ฆฝํ๋ ๋๋์ด ๋ค์๊ณ , ๊ฐ๋ ์ฑ์ด ์ข์์ง ๊ฒ ๊ฐ์ ๋ ๊ณ ์ฒ๋ผ ์กฐ๋ฆฝํ๋ ๋๋์ด์์ต๋๋ค.
'์๋ฃ๊ตฌ์กฐ & ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] ์ ํ ์ ํ 11060 (0) 2024.07.13 [ํ๋ก๊ทธ๋๋จธ์ค] ์์ ์ง๋ (0) 2023.06.29 [ํ๋ก๊ทธ๋๋จธ์ค] 1์ฐจ ๋น๋ฐ์ง๋ (0) 2023.06.08 [๋ฐฑ์ค] ํ์ ๋ฒํธ 1235 (2) 2023.06.06 [๋ฐฑ์ค] ์ด์ ๊ณ์ฐ 2644๋ฒ (0) 2023.06.04