[Swift] [86일차] 807_스카이라인

·2025년 3월 5일
0

SwiftAlgorithm

목록 보기
91/105
post-thumbnail

807. Max Increase to Keep City Skyline


문제 설명

  1. 스카이라인으로 위장한 grid가 주어진다. (2차원 배열)
  2. 이차원배열에서 각각 S W E N (동서남북)방향으로 바라봤을때의 스카이라인을 유지시키면서
  3. 빌딩을 높일 수 있을때 최대 올릴 수 있는 높이값을 다 계산해주면 된다.

문제 풀이

  1. 처음에는 문제가 이해가 안됐다. 이게 그냥 각각 바라보는대로 출력을하라는 것인지알았는데, 예제의 값이 좀 다르게 나타나서, 문제 이해하는데에 좀 더 걸린 것 같다.
  2. 각각 보긴하는데, 여기서 <기존 모든 방향에서의 스카이라인을 유지시키면서> 최대한 높일 수 있는 건물의 높이의 합을 구하는거니까
  3. 일단 각 행/열에 따른 최대값을 구해주고, 해당 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]번째를 추출할 수 있다는 것을 기억해놔야겠다.

profile
기억보단 기록을

0개의 댓글