์๋ ํ์ธ์ ์ ์ธ์ ๋๋ค :)
์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ๋ค๊ฐ ๋์ ํฉ์ ์ด์ฉํด ๊ตฌ๊ฐ์ ๋ณํ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๋ก ์๊ฒ ๋์ด ๋ฌธ์ ํ์ด์ ํจ๊ป ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค. <ํ๋ก๊ทธ๋๋จธ์ค(Lv.3) - ํ๊ดด๋์ง ์์ ๊ฑด๋ฌผ> ๋ฌธ์ ํ์ด๋ฅผ ํตํด ๋์ ํฉ์ ๋ํด ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
๋ฌธ์ ๋งํฌ
๋ฌธ์ ํ์ด
์ฒ์ ์ ๊ทผ
ํด๋น ๋ฌธ์ ๋ ์ ๊ตฐ์ด ํน์ ๊ฑด๋ฌผ๋ค์ ๊ณต๊ฒฉํ๊ณ ์๊ตฐ์ด ํ๋ณตํ๋ ๊ณผ์ ์ ๊ฑฐ์ณ ์ต์ข ์ ์ผ๋ก ํ๊ดด๋์ง ์์ ๊ฑด๋ฌผ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ 2์ฐจ์ ๋ฐฐ์ด ์์์ ๊ฐ์ ๋ณํ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๊ด๊ฑด์ ๋๋ค! (ํจ์จ์ฑ ํ ์คํธ ์กด์ฌ) ์ ๋ ํจ์จ์ ์ธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ํ ์์ด๋์ด๊ฐ ๋ ์ค๋ฅด์ง ์์ ์์ ํ์์ผ๋ก ํ์ดํ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ๋น์ฐํ ํจ์จ์ฑ ํ ์คํธ์์ ์คํจ..๐ฅฒ
์์ ํ์ ํ์ด (์ ํ์ฑ 100%, ํจ์จ์ฑ 0%)
import Foundation
func solution(_ board:[[Int]], _ skill:[[Int]]) -> Int {
var board = board
func modifyBoard(_ type: Int, _ r1: Int, _ c1: Int, _ r2: Int, _ c2: Int, _ degree: Int) {
for i in r1...r2 {
for j in c1...c2 {
board[i][j] = type == 1 ? (board[i][j] - degree) : (board[i][j] + degree)
}
}
}
for arr in skill {
modifyBoard(arr[0], arr[1], arr[2], arr[3], arr[4], arr[5])
}
return board.flatMap{$0}.filter{$0 > 0}.count
}
ํจ์จ์ฑ ๊ฐ์ ์ ์ํด ๋ฌธ์ ํ์ด๋ฅผ ์ฐพ์๋ณด์๋๋ฐ์, ํด๋น ๋ฌธ์ ๊ฐ ์นด์นด์ค ๊ธฐ์ถ๋ฌธ์ ๋ผ ๊ณต์ ํ ํฌ ๋ธ๋ก๊ทธ์ ํ์ด์ ์ด์ฉํด์ผ ํ๋ ์์ด๋์ด์ ๋ํด ๊ต์ฅํ ์์ธํ ์ค๋ช ๋์ด ์๋๋ผ๊ตฌ์! ๊ณต์ ํด์ค์ ์ฐธ๊ณ ํ์ฌ ๋์ ํฉ์ ์ด์ฉํด ๊ตฌ๊ฐ์ ๋ณํ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ตฌํ๋ ๋ฐฉ๋ฒ, ์ด๋ฅผ 2์ฐจ์ ๋ฐฐ์ด์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ ๋ฆฌํด๋ณด๊ณ , ํด๋น ๋ฌธ์ ๋ฅผ Swift๋ก ํ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋์ ํฉ์ ์ด์ฉํ ๋ฐฉ๋ฒ
์์ ํ์์ผ๋ก 2์ฐจ์ ๋ฐฐ์ด์ ๊ฐ์ด ๋ณํ ๋๋ง๋ค ์์์ ์ ๊ทผํด ์๋ก์ด ๊ฐ์ ๊ณ์ํด์ ์ ์ฅํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ํ์ดํ๋ค๋ฉด, ์ ํ์ฑ ํ ์คํธ ์ผ์ด์ค๋ ๋ชจ๋ ๋ง์ถ ์ ์์ง๋ง, ์๊ฐ ๋ณต์ก๋๊ฐ O(N * M * K)๊ฐ ๋์ด ํจ์จ์ฑ ํ ์คํธ ์ผ์ด์ค์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
์ด๋ฅผ ๊ฐ์ ํ๋ ค๋ฉด ๋์ ํฉ์ ์ด์ฉํด ๊ตฌ๊ฐ์ ๋ณํ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
2์ฐจ์ ๋ฐฐ์ด์ ์ ์ฉํ๊ธฐ ์ ์, ๋จผ์ 1์ฐจ์ ๋ฐฐ์ด์ ์์๋ก ๋์ ํฉ์ ์ด์ฉํด ์๊ฐ ๋ณต์ก๋๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ์ ๋ํด ์ดํดํด๋ณด๊ฒ ์ต๋๋ค!
์๋ฅผ ๋ค์ด, [1, 2, 4, 8, 9]์ ๋ฐฐ์ด์ด ์๊ณ , 0๋ฒ์งธ๋ถํฐ 3๋ฒ์งธ ์์๊น์ง 2๋งํผ ๋นผ์ผ ํ๋ ์ํฉ์ด๋ผ๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค. ์ฆ, ๋ฐฐ์ด์ [-1, 0, 2, 6, 9]๋ก ๋ง๋ค๊ณ ์ถ์ ์ํฉ์ ๋๋ค. ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก, ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด 0~3๋ฒ์งธ ์์์ ์ ๊ทผํด -2๋ฅผ ํด์ค ์ ์๊ฒ ์ฃ ! but ์ด ๋ฐฉ๋ฒ์ O(M)์ ์๊ฐ ๋ณต์ก๋๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ๋์ ํฉ์ ์ด์ฉํ๋ค๋ฉด O(M)์ ์๊ฐ ๋ณต์ก๋๋ฅผ O(1)๋ก ์ค์ผ ์ ์์ต๋๋ค! (wow..)
ํด๋น ์์์ ์ ์ฉํด๋ด ์๋ค. ๋จผ์ , ๋ณํ๋ฅผ ์ฃผ๊ณ ์ ํ๋ ๋ฐฐ์ด๊ณผ ๋๊ฐ์ ํฌ๊ธฐ์ธ๋ฐ ๋ชจ๋ ์์๊ฐ 0์ผ๋ก ์ด๊ธฐํ๋์ด ์๋ ๋ฐฐ์ด([0, 0, 0, 0, 0])์ ๋จผ์ ๋ง๋ญ๋๋ค. ๊ทธ๋ฐ ๋ค์, ํน์ ๊ตฌ๊ฐ์ c๋งํผ์ ๋ณํ๋ฅผ ์ฃผ๊ธธ ์ํ๋ค๋ฉด ์ด๊ธฐํ๋ ๋ฐฐ์ด์ ๊ตฌ๊ฐ์ ์ฒซ๋ฒ์งธ ์์์ +c, ๊ตฌ๊ฐ์ ๋ง์ง๋ง+1๋ฒ์งธ ์์์ -c๋ฅผ ํด์ค๋๋ค. (์ฆ, 1์ฐจ์ ๋ฐฐ์ด์ a๋ฒ์งธ ์์๋ถํฐ b๋ฒ์งธ ์์๊น์ง c๋งํผ์ ๋ณํ๋ฅผ ์ฃผ๊ฒ ๋ค๊ณ ํ๋ฉด ์๋ก์ด ๋ฐฐ์ด์ a๋ฒ์งธ ์์์ c๋ฅผ ๋ํ๊ณ b+1๋ฒ์งธ ์์์ c๋ฅผ ๋นผ๋ฉด ๋ฉ๋๋ค.) ํด๋น ์์์์๋ 0~3๋ฒ์งธ ์์์ -2๋งํผ์ ๋ณํ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ 0๋ฒ์งธ ์์์ -2, 4๋ฒ์งธ ์์์ +2๋ฅผ ํด์ ๋ฐฐ์ด์ [-2, 0, 0, 0, 2]๋ก ๋ง๋ค์ด์ค๋๋ค. ์ด ๋ฐฐ์ด์ ์์์๋ถํฐ ๋์ ํฉํ๋ฉด [-2, -2, -2, -2, 0] ์ด ๋ฉ๋๋ค. ์ด๋ฅผ ์๋ ๋ฐฐ์ด๊ณผ ๋ํด์ฃผ๋ฉด [-1, 0, 2, 6, 9]๋ผ๋ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค! ์ด ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํ๋ฉด O(N * M * K)์ ๋ณต์ก๋๋ฅผ O(N * K)๋ก ์ค์ผ ์ ์์ง๋ง, ์ด ๋ํ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด ์์ด๋์ด๋ฅผ 2์ฐจ์ ๋ฐฐ์ด๋ก ํ์ฅํ๋ค๋ฉด O(N * K)๋ฅผ O(1)๊น์ง ์ค์ผ ์ ์์ต๋๋ค.
์ด๋ฒ์๋ 2์ฐจ์ ๋ฐฐ์ด์ (0,0)๋ถํฐ (2,2)๊น์ง n๋งํผ ๋ณํ์ํค๋ ๊ฒฝ์ฐ๋ฅผ ์๋ก ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ , ์์์ 1์ฐจ์ ๋ฐฐ์ด์ ๋ณํ๋ฅผ ์ค ๊ฒ์ฒ๋ผ 2์ฐจ์ ๋ฐฐ์ด์ด์ง๋ง ํ(๊ฐ๋ก)๋ง ๋ฐ๋ก ๋ด์ ์์ ์์ด๋์ด๋ฅผ ์ ์ฉ์ํค๋ฉด ์๋์ ๊ฐ์ ๋ฐฐ์ด์ด ๋์ต๋๋ค. (๊ฐ ํ์ 0๋ฒ์งธ ์์์ +n, 3๋ฒ์งธ ์์์ -n)
n 0 0 -n
n 0 0 -n
n 0 0 -n
์ด์ , ์ด(์ธ๋ก)๋ง ๋ฐ๋ก ๋ด ์๋ค. 2์ฐจ์ ๋ฐฐ์ด์ด์ง๋ง ์ด๋ง ๋ฐ๋ก ๋ณธ๋ค๋ฉด ์ฒซ๋ฒ์งธ ์ด์๋ง 0~2๋ฒ์งธ ์์์ n๋งํผ์ ๋ณํ, 3๋ฒ์งธ ์ด์๋ง 0~2๋ฒ์งธ ์์์ -n๋งํผ์ ๋ณํ๋ฅผ ์ค ๊ฒ์ผ๋ก ๋ณผ ์ ์๊ฒ ์ฃ ! ์ฌ๊ธฐ์ ์์ ์์ด๋์ด๋ฅผ ๋ ์ ์ฉ์ํค๋ฉด, ์๋์ ๊ฐ์ 2์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค ์ ์์ต๋๋ค. (0๋ฒ์งธ ์ด์ 0๋ฒ์งธ ์์์ +n, 3๋ฒ์งธ ์์์ -n. 3๋ฒ์งธ ์ด์ 0๋ฒ์งธ ์์์ -n, 3๋ฒ์งธ ์์์ -(-n))
n 0 0 -n
0 0 0 0
0 0 0 0
-n 0 0 n
์ฆ, 2์ฐจ์ ๋ฐฐ์ด์์ (x1, y1)๋ถํฐ (x2, y2)๊น์ง n๋งํผ์ ๋ณํ๋ (x1, y1)์ +n, (x1, y2+1)์ -n, (x2+1, y1)์ -n, (x2+1, y2+1)์ +n์ ํ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
์ ๋ฐฐ์ด์ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋์ ํฉ ํ ๋ค, ์์์ ์๋๋ก ๋์ ํฉํ๋ฉด ์ฒ์์ ์๋ํ (0,0)๋ถํฐ (2,2)๊น์ง n๋งํผ ๋ณํ์ํค๋ ๋ฐฐ์ด์ด ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. (์ผ -> ์ค, ์ -> ์๋ ์์ ๋ฐ๋์ด๋ ๊ฒฐ๊ณผ ๊ฐ ๋์ผ)
n n n 0
n n n 0
n n n 0
0 0 0 0
์ด๋ฌํ ๋ฐฉ๋ฒ์ผ๋ก skill์ ํ ์์๋ฅผ O(1)๋ง์ ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ๋ฐฉ๋ฒ์ผ๋ก K๊ฐ์ skill์ ๋ชจ๋ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฐ์ด์ ๋ง๋๋๋ฐ O(K)๊ฐ ๊ฑธ๋ฆฌ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ต์ข ๊ฒฐ๊ณผ ๊ฐ์ ๊ตฌํ๊ธฐ ์ํด ์๋ ๋ฐฐ์ด๊ณผ ๋์ ํฉ ๋ฐฐ์ด์ ๋ํ๋ ๊ณผ์ ์ O(N * M)๊ฐ ๊ฑธ๋ฆฌ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ O(K + N * M)์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ด ๊ณผ์ ์ Swift ์ฝ๋๋ก ํ์ดํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Swift ํ์ด ์ฝ๋
import Foundation
func solution(_ board:[[Int]], _ skill:[[Int]]) -> Int {
let sumBoard = prefixSum(board, skill)
let newBoard = makeNewBoard(board, sumBoard)
return newBoard.flatMap{$0}.filter{$0 > 0}.count
}
// ์คํฌ์ ์ด์ฉํ ๋์ ํฉ ๋ฐฐ์ด์ ๊ตฌํ๋ ๋ฉ์๋
func prefixSum(_ board: [[Int]], _ skills: [[Int]]) -> [[Int]] {
let (n, m) = (board.count, board[0].count)
// ๋ชจ๋ ํ,์ด 0์ผ๋ก ์ด๊ธฐํ
var prefixBoard: [[Int]] = Array(repeating: Array(repeating: 0, count: m + 1), count: n + 1)
for skill in skills {
let type = skill.first!
var degree = skill.last!
let (si, sj) = (skill[1], skill[2]) // ์์์
let (ei, ej) = (skill[3], skill[4]) // ๋์
if type == 1 {
degree *= -1
}
prefixBoard[si][sj] += degree // ์์์ ์ degree ์ค์
prefixBoard[si][ej + 1] -= degree // ์์ํ์ ๋์ +1์ -degree๊ฐ ์ค์
prefixBoard[ei + 1][sj] -= degree // ์์์ด์์ ๋์ +1์ -degree๊ฐ ์ค์
prefixBoard[ei + 1][ej + 1] += degree // ํ์ด ๋์ +1์ degree ์ค์
}
// ์ผ -> ์ค ๋์ ํฉ
for i in 0 ..< n {
for j in 1 ..< m {
prefixBoard[i][j] += prefixBoard[i][j - 1]
}
}
// ์ -> ์๋ ๋์ ํฉ
for j in 0 ..< m {
for i in 1 ..< n {
prefixBoard[i][j] += prefixBoard[i - 1][j]
}
}
return prefixBoard
}
// ๋์ ํฉ ๋ฐฐ์ด์ ์๋ ๋ฐฐ์ด๊ณผ ๋ํ๋ ๋ฉ์๋
func makeNewBoard(_ board: [[Int]], _ sumBoard: [[Int]]) -> [[Int]] {
let (n, m) = (board.count, board[0].count)
var newBoard = Array(repeating: Array(repeating: 0, count: m), count: n)
for i in 0..<n {
for j in 0..<m {
newBoard[i][j] = board[i][j] + sumBoard[i][j]
}
}
return newBoard
}
2์ฐจ์ ๋ฐฐ์ด์ ์์์ ์ฌ๋ฌ๋ฒ ์ ๊ทผํด์ผ ํ๋ ๋ฌธ์ ์์ ์ด ๋์ ํฉ ์์ด๋์ด๋ฅผ ์ ์ดํดํด๋๊ณ ์์ฉํ๋ฉด ํจ์ฌ ํจ์จ์ ์ธ ํ์ด๊ฐ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค!
[์ฐธ๊ณ ์๋ฃ]
'๐ฅ CS > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm/Swift] BOJ(๊ณจ๋4) - 2573 ๋น์ฐ (2) | 2023.12.26 |
---|---|
[Algorithm/Swift] ํ๋ก๊ทธ๋๋จธ์ค(Lv.3) - ํ ํธ์ง (0) | 2023.08.15 |
[Algorithm/Swift] ํ๋ก๊ทธ๋๋จธ์ค(Lv.3) - ์คํฐ์ปค ๋ชจ์ผ๊ธฐ(2) (3) | 2023.05.01 |
[Algorithm/Swift] ํ๋ก๊ทธ๋๋จธ์ค(Lv.3) - ์ ๊ตญ์ฌ์ฌ (2) | 2023.04.05 |
[Algorithm/Swift] ํ๋ก๊ทธ๋๋จธ์ค(Lv.2) - ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ ์ฐพ๊ธฐ (2) | 2023.04.03 |