807. Max Increase to Keep City Skyline
문제 설명
- 스카이라인으로 위장한
grid
가 주어진다. (2차원 배열)- 이차원배열에서 각각 S W E N (동서남북)방향으로 바라봤을때의 스카이라인을 유지시키면서
- 빌딩을 높일 수 있을때 최대 올릴 수 있는 높이값을 다 계산해주면 된다.
문제 풀이
- 처음에는 문제가 이해가 안됐다. 이게 그냥 각각 바라보는대로 출력을하라는 것인지알았는데, 예제의 값이 좀 다르게 나타나서, 문제 이해하는데에 좀 더 걸린 것 같다.
- 각각 보긴하는데, 여기서 <기존 모든 방향에서의 스카이라인을 유지시키면서> 최대한 높일 수 있는 건물의 높이의 합을 구하는거니까
- 일단 각 행/열에 따른 최대값을 구해주고, 해당 i,j일때 i행,j열에서의 최대값끼리 비교하면서 작은 값으로 상한선을 맞춰주면은 이제 거기서 빼주면 되는 것 !
maxCol
, maxRow
로 손봐줬다.var maxRow = [Int]()
var maxCol = [Int]()
for i in 0 ..< grid[0].count {
var a = 0
var b = 0
for j in 0 ..< grid.count {
if a < grid[j][i] {
a = grid[j][i]
}
if b < grid[i][j] {
b = grid[i][j]
}
}
maxCol.append(a)
maxRow.append(b)
}
min(maxRow[i],maxCol[j])
를 계속 순환 시켜주는 것
for i in 0 ..< LEN {
var tmp = [Int]()
for j in 0 ..< LEN {
tmp.append(min(maxRow[i], maxCol[j]))
}
newGrid.append(tmp)
}
이제 원하는 대로 문제에 나온 newGrid가 완성되었다.
[[8, 4, 8, 7], [7, 4, 7, 7], [9, 4, 8, 7], [3, 3, 3, 3]]
그러면 이제 이걸 활용해서 원본 배열에서 맞는 인덱스끼리 빼주면 끝 !
var answer = 0
for i in 0 ..< LEN {
for j in 0 ..< LEN {
answer += (newGrid[i][j] - grid[i][j])
}
}
큰값들끼리 비교한 것이라 굳이abs
사용할 필요 없이 그냥 newGrid
에서 grid
값을 빼주면 된다.
최종 제출 코드
타인의 코드
풀면서 의아했던거는 아 이렇게 좀 비슷한 반복문을 계속 써주는게 맞나? 좀 더 명확하게 쓸 수 있지않을까?궁금해서 그 방면으로 좀 다른 코드들을 살펴봤다.
class Solution {
func maxIncreaseKeepingSkyline(_ grid: [[Int]]) -> Int {
guard !grid.isEmpty else { return 0 }
let numRows = grid.count
let numCols = grid[0].count
var rowMax: [Int] = Array(repeating: 0, count: numRows)
var colMax: [Int] = Array(repeating: 0, count: numCols)
for row in 0..<numRows {
rowMax[row] = grid[row].max()!
}
for col in 0..<numCols {
colMax[col] = grid.map { $0[col] }.max()!
}
var diffSum = 0
for row in 0..<numRows {
for col in 0..<numCols {
let diff = min(rowMax[row], colMax[col]) - grid[row][col]
diffSum += diff
}
}
return diffSum
}
}
둘이 다른 코드는 딱 이정도? 그냥 해당 값에서 max()! 값 추출해주는 건데, 나도 이렇게하려다가 좀 어렵다고 느낀거는 col때문이었다. 열 값을 어떻ㄱ ㅔ하나씩 추출해서 하지 ? 했는데, 아래에서 확인할 수 있었다.
for row in 0..<numRows { rowMax[row] = grid[row].max()! } for col in 0..<numCols { colMax[col] = grid.map { $0[col] }.max()! }
생각대로 for문으로 뻗다가
$0[col]
로 해당 인덱스에 포커싱해주면 모든 줄의 [col]번째를 추출할 수 있다는 것을 기억해놔야겠다.