2482. Difference Between Ones and Zeros in Row and Column
문제 설명
![]()
행의 1개수 + 열의 1개수 - (행의 0개수 + 열의 행 개수
문제풀이
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행렬 도는게 중요한 것 같아서 그 부분 잘 파악해서 해줬는데. 시간초과가 떴다.
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
}
}