Leetcode) Set Matrix Zeroes

Duna·2021년 8월 21일
0
post-thumbnail

Top Interview Questions
Medium Collection

Link of Problem

LEVEL : 🌕 🌕 🌕 🌑 🌑 (중)


Medium으로 넘어온 뒤에 풀어본 2번째 문제였습니다.

이 문제는 제목 그대로, Matrix를 0으로 설정하는 문제였습니다. Matrix속에 0이 있다면 그 0이 있는 자리와 같은 행, 열에 있는 수들을 모두 0으로 변경시키는 문제였습니다.

이번에 문제를 풀 때 노력해본 것이 있다면, 문제를 보고 코드로 바로 치기보다는 생각 먼저 해보기였습니다. 말은 쉽지만 문제를 보면 코드로 먼저 치기 마련이거든요.
이번엔 공책에 문제를 좀 정리하고 풀도록 했습니다.

꾸준히 습관으로 만들 생각입니다.

1️⃣ 번째 방법

처음 든 생각이 "한 번 for문을 돌면서 어느 지점에 0이 있는지 찾아내자" 였습니다.

일단 enumerated()를 써서 row에 있는 배열 뿐만 아니라 각 배열의 index, 그리고 배열 안에 있는 원소들의 column index를 빼왔어요. 그리고 해당 위치에 있는 숫자가 0이라면 그 row, column에 해당하는 index를 전에 만들어둔 Set에다가 넣어줬습니다.

Set를 사용한 이유는 Set이 중복을 제거해주기 때문입니다.
0이 같은 행,열에 있을 경우 계속해서 같은 숫자가 들어오게 되는데 이럴 경우에는 이미 0으로 만들어진 행,열을 또 0으로 만드는 의미없는 일들이 계속 일어날 거 같아서 Set으로 만들어 중복을 완전히 제거해줬습니다.

그리고 위의 for문에서 설정한 rows colunms에 따라서 for문을 돌리면서 행과 열에 0를 집어 넣어줬습니다.

func setZeroes(_ matrix: inout [[Int]]) {
    var rows = Set<Int>()
    var colunms = Set<Int>()
    
    for (index, row) in matrix.enumerated() {
        for (col, num) in row.enumerated() {
            if num == 0 {
                rows.insert(index)
                colunms.insert(col)
            }
        }
    }
    
    for i in rows {
        for j in 0..<matrix[0].count {
            matrix[i][j] = 0
        }
    }
    
    for i in colunms {
        for j in 0..<matrix.count {
            matrix[j][i] = 0
        }
    }
}

Runtime은 너무 나쁘지도 좋지도 않은 정도로 나왔습니다.

2️⃣ 번째 방법

두 번째 방식도 첫번째와 크게 다르지 않습니다.
하나 다른 게 있다면, 위처럼 행과 열을 적용해주는 코드를 2번에 나눠서 쓰지 않고 한 번에 썼어요.

insert해주는 코드는 거의 동일하고, insert에 맞춰서 새로운 0를 넣어주는 부분이 조금 달랐습니다.

이번에는 contains를 사용해서 이중 for문을 돌렸습니다.
해당 부분의 숫자가 0이 아니고, rows 또는 cols에 들어있는 행, 열이라면 그 부분을 0으로 만들어줬습니다.

이중 for문이 2번으로 줄었기 때문에 시간이 훨씬 줄었을거라고 생각했는데요.

func setZeroes(_ matrix: inout [[Int]]) {
    if matrix.count == 0 { return }
    
    var rows: Set<Int> = []
    var cols: Set<Int> = []
    
    for i in 0..<matrix.count {
        for j in 0..<matrix[i].count {
            if matrix[i][j] == 0 {
                rows.insert(i)
                cols.insert(j)
            }
        }
    }
    
    for i in 0..<matrix.count {
        for j in 0..<matrix[i].count {
            if matrix[i][j] != 0 && (rows.contains(i) || cols.contains(j)) {
                matrix[i][j] = 0
            }
        }
    }
 }

처음엔 오히려 늘었습니다..😂 역시 Leetcode의 Runtime은 오락가락이네요..
그래도 두번째 돌렸을 때는 많이 떨어졌어요.

profile
더 멋진 iOS 개발자를 향해

0개의 댓글