[Swift] [51일차] 2482_LEET

·2025년 1월 27일
0

SwiftAlgorithm

목록 보기
54/105
post-thumbnail

2482. Difference Between Ones and Zeros in Row and Column


문제 설명

  1. 행렬에서 속한 친구의 행의 1개수 + 열의 1개수 - (행의 0개수 + 열의 행 개수
  2. 동일하게 행렬의 형태로 return

문제풀이

class Solution {
    func onesMinusZeros(_ grid: [[Int]]) -> [[Int]] {
        // (0,1)이면 행 [0][0~3] 열 [0~3][1]
        var maxRow = grid.count
        var maxCol = grid[0].count
        var answerGrid = Array(
            repeating: Array(repeating: 0, count: maxCol),
            count: maxRow
        )
        var cursor = (row: 0, col: 0)

        while cursor.row < maxRow, cursor.col < maxCol { // 다 돌때까지
            // row판단
            var count = 0
            for col_num in 0 ..< maxCol {
                count += grid[cursor.row][col_num] == 0 ? -1 : +1
            }
            for row_num in 0 ..< maxRow {
                print(row_num)
                count += grid[row_num][cursor.col] == 0 ? -1 : +1
            }
            answerGrid[cursor.row][cursor.col] = count
            count = 0
            cursor.col += 1
            if cursor.col == maxCol { // 끝까지보면 row 바꿔주고 0으로 초기화
                cursor.row += 1
                cursor.col = 0
            }
        }
        return answerGrid
    }
}

// print(Solution().onesMinusZeros([[0, 1, 1], [1, 0, 1], [0, 0, 1]]))
print(Solution().onesMinusZeros([[1, 1, 1], [1, 1, 1]]))

그냥 일반적으로 생각하는대로 풀어줬다 grid행렬 도는게 중요한 것 같아서 그 부분 잘 파악해서 해줬는데. 시간초과가 떴다.

아마 for문으로 너무 다 계산을 해줬나? 해서 시간 줄이기 위해서 어떻게할지 고민하다가 이거 행 열에 1개수를 미리 카운팅해놓으면 될지도 ?

각 행과 열별로 1의 개수 카운팅

var rowOne: [Int] = Array(repeating: 0, count: maxRow)
        var colOne: [Int] = Array(repeating: 0, count: maxCol)
        for i in 0 ..< maxRow {
            var count = 0
            for j in 0 ..< maxCol {
                count += grid[i][j] == 0 ? -1 : +1
            }
            rowOne[i] = count
        }

        for i in 0 ..< maxCol {
            var count = 0
            for j in 0 ..< maxRow {
                count += grid[j][i] == 0 ? -1 : +1
            }
            colOne[i] = count
        }

다 카운팅이 되어있으니까

for i in 0 ..< maxRow {
            for j in 0 ..< maxCol {
                answerGrid[i][j] = rowOne[i] + colOne[j]
            }
        }

그냥 이렇게 좌표별로 행,열 더해주면 끝!

타인의 코드

class Solution {
    func onesMinusZeros(_ grid: [[Int]]) -> [[Int]] {
        var oneRow = [Int](repeating: 0, count: grid.count)
        var oneCol = [Int](repeating: 0, count: grid[0].count)
        for row in 0 ..< grid.count {
            for col in 0 ..< grid[row].count {
                if grid[row][col] == 1 {
                    oneRow[row] += 1
                    oneCol[col] += 1
                }
            }
        }
        var result = [[Int]](repeating: [Int](repeating: -grid.count - grid[0].count, count: grid[0].count), count: grid.count)
        for row in 0 ..< grid.count {
            for col in 0 ..< grid[row].count {
                result[row][col] += 2 * (oneRow[row] + oneCol[col])
            }
        }
        return result
    }
}

이분은 일단 1을 카운팅하고 0의 개수를 길이에서 빼주는 형태로 가신듯 보였다. 그리고 그중에서 특히

이 부분이 진짜 이해안돼서 좀 오래 봤던 것 같다.

2 * (oneRow[row] + oneCol[col]) - (grid[0].count + grid.count)

왜 2를 곱하지 ? 싶었는데, 이게 1의 개수만 카운팅을 해줬으니까 각 0의 개수를 구하기 위해서는 길이에서 1의 카운팅만큼 빼줘야하기 때문에 정리하면 저렇게 X2 형태가 나오는 것이다.

(oneRow[row] + oneCol[col]) - ((grid[0].count - oneRow[row]) + (grid.count - oneCol[col]))

내 코드는 이거 보니까 반복문 하나정도는 줄일 수 있겠다 싶어서 다음과 같이 바꿔줬다.

기존

for i in 0 ..< maxRow {
            var count = 0
            for j in 0 ..< maxCol {
                count += grid[i][j] == 0 ? -1 : +1
            }
            rowOne[i] = count
        }

        for i in 0 ..< maxCol {
            var count = 0
            for j in 0 ..< maxRow {
                count += grid[j][i] == 0 ? -1 : +1
            }
            colOne[i] = count
        }

개선

       for i in 0..<maxRow {
            for j in 0..<maxCol {
                let value = grid[i][j] == 0 ? -1 : 1
                rowOne[i] += value
                colOne[j] += value
            }
        }

반복문으로 굳이 한번에 해줄 필요 없으니까 이걸 누적시키면서 계산을 해주니까 해결 할 수 있었다.

profile
기억보단 기록을

0개의 댓글