Skip to content

Commit

Permalink
update post
Browse files Browse the repository at this point in the history
  • Loading branch information
dev-jonghoonpark committed Aug 4, 2024
1 parent 18c5181 commit 2b06aa0
Showing 1 changed file with 102 additions and 6 deletions.
108 changes: 102 additions & 6 deletions _posts/2024-02-16-leetcode-73.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,13 +102,9 @@ n == matrix[0].length

시간복잡도는 `O(n * m)` 공간복잡도는 `O(n * m)` 이다.

### in place 방식으로 접근해보기
### simple improvement `O(n + m)`

문제를 자세히 읽어보면 [in place](https://en.wikipedia.org/wiki/In-place_algorithm) 방식으로 풀라고 되어있다. 추가적인 공간을 사용하면 안된다. 그래서 다음과 같이 바꿔보았다. 컨셉은 첫번째 풀이와 동일하다.

행렬의 값은 `-231 <= matrix[i][j] <= 231 - 1` 으로 정의 되어 있다. 따라서 값을 변경해서 이미 진행된 값인지 표시하는 것은 불가능 하다.

어떤 행과 열이 0으로 바뀔지만 기록해둔다면 이전보다는 공간을 절약할 수 있다.
어떤 행과 열이 0으로 바뀔지만 기록해둔다면 이전보다 공간을 절약할 수 있다.

```java
class Solution {
Expand Down Expand Up @@ -154,3 +150,103 @@ n == matrix[0].length
```

시간복잡도는 `O(n * m)` 공간복잡도는 `O(n + m)` 이다. 공간 복잡도가 개선되었다.

### in place 방식

문제를 자세히 읽어보면 [in place](https://en.wikipedia.org/wiki/In-place_algorithm) 방식으로 풀라고 되어있다. 추가적인 공간을 사용하면 안된다. 그래서 다음과 같이 바꿔보았다. 컨셉은 첫번째 풀이와 동일하다.

행렬의 값은 `-231 <= matrix[i][j] <= 231 - 1` 으로 정의 되어 있다. 따라서 값을 변경해서 이미 진행된 값인지 표시하는 것은 불가능 하다.

bit를 사용해볼까도 고민해보았는데 문제에는 아래의 제약조건이 있어 포기하였다.

```
1 <= m, n <= 200
```

그러면 어떻게든 row, col 하나의 변수를 가지고 처리를 해야한다는 것이다.

힌트 3번을 보면 다음과 같은 내용이 있다.

```
We could have used 2 sets to keep a record of rows/columns which need to be set to zero. But for an O(1) space solution, you can use one of the rows and and one of the columns to keep track of this information.
```

이 힌트를 따라 다음과 같은 코드를 작성해보았다.

```java
class Solution {
public void setZeroes(int[][] matrix) {
boolean shouldUpdateFirstRow = false;
boolean shouldUpdateFirstColumn = false;

for (int i = 0; i < matrix.length; i++) {
if (matrix[i][0] == 0) {
shouldUpdateFirstColumn = true;
break;
}
}

for (int j = 0; j < matrix[0].length; j++) {
if (matrix[0][j] == 0) {
shouldUpdateFirstRow = true;
break;
}
}

for (int i = 1; i < matrix.length; i++) {
for (int j = 1; j < matrix[0].length; j++) {
if (matrix[i][j] == 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}

// update row
for (int i = 1; i < matrix.length; i++) {
if (matrix[i][0] == 0) {
Arrays.fill(matrix[i], 0);
}
}

// update column
for (int j = 1; j < matrix[0].length; j++) {
if (matrix[0][j] == 0) {
for (int i = 0; i < matrix.length; i++) {
matrix[i][j] = 0;
}
}
}

// update first row if contains zero
if (shouldUpdateFirstRow) {
Arrays.fill(matrix[0], 0);
}

// update first column if contains zero
if (shouldUpdateFirstColumn) {
for (int i = 0; i < matrix.length; i++) {
matrix[i][0] = 0;
}
}
}
}
```

풀이 방법에 대해 설명을 하면 다음과 같다.

- 먼저는 첫번째 행과 열에 0이 있는지 미리 확인해둔다. (`shouldUpdateFirstRow`, `shouldUpdateFirstColumn`)
- 이후에는 첫번째 행과 열을 제외하고 0이 발견될 경우 첫번째 행과 열에 0으로 표시해둔다.
- 표시가 끝났으면 첫번째 행과 열을 확인하여 0일 경우 해당 줄, 열을 0으로 업데이트 한다. (단 첫번째 행과 열은 업데이트 하지 않는다., `i > 0`, `j > 0`)
- 업데이트가 끝났다면 `shouldUpdateFirstRow`, `shouldUpdateFirstColumn` 값을 확인하여 첫번째 행과 열도 0으로 업데이트 해야하는지 확인한다. 필요할 경우 0으로 업데이트 한다.

#### TC, SC

문제에서 m과 n이 다음과 같이 정의되어 있다.

```
m == matrix.length
n == matrix[0].length
```

시간복잡도는 `O(n * m)` 공간복잡도는 `O(1)` 이다. 공간 복잡도가 한 번 더 개선되었다.

0 comments on commit 2b06aa0

Please sign in to comment.