이진 행렬(binary matrix) mat이 주어졌다고 가정해 보겠습니다. 우리가 해야 할 작업은 행렬의 각 행을 선택해 순서를 거꾸로 뒤집은 다음, 행 내의 모든 비트를 반전시키는 것입니다. 즉, 0은 1로, 1은 0으로 바꿉니다.
문제 예시
예를 들어 입력이 다음과 같다면,
| 1 | 1 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 1 |
출력 결과는 다음과 같습니다.
| 1 | 0 | 0 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
풀이 접근 방법
이 문제는 다음 단계를 따라 해결할 수 있습니다.
- 행 인덱스를 나타내는 변수 track을 0으로 초기화합니다.
- mat의 각 행에 대해 다음을 수행합니다.
- 해당 행을 뒤집습니다(reverse).
- 열 인덱스를 나타내는 tracker를 0으로 초기화합니다.
- 행의 각 값 val에 대해 다음을 수행합니다.
- val이 1이면 mat[track][tracker]를 0으로 설정합니다.
- 그렇지 않으면(0이면) mat[track][tracker]를 1로 설정합니다.
- tracker를 1 증가시킵니다.
- track을 1 증가시킵니다.
- 변환된 mat을 반환합니다.
이 알고리즘의 시간 복잡도는 행렬의 모든 원소를 한 번씩만 방문하므로 O(n × m)입니다. 여기서 n은 행의 개수, m은 열의 개수입니다.
구현 예제
아래 구현 예제를 통해 더 잘 이해해 보겠습니다.
class Solution: def solve(self, mat): track = 0 for row in mat: row.reverse() tracker = 0 for val in row: if val == 1: mat[track][tracker] = 0 else: mat[track][tracker] = 1 tracker += 1 track += 1 return mat ob = Solution() mat = [[1,1,0],[0,1,0],[0,0,1]] print(ob.solve(mat))
입력
[[1,1,0],[0,1,0],[0,0,1]]
출력
[[1, 0, 0], [1, 0, 1], [0, 1, 1]]
위 코드에서는 먼저 row.reverse()로 각 행의 순서를 뒤집은 뒤, 같은 위치의 값을 조건문으로 확인하여 0과 1을 서로 교체합니다. 이 과정을 모든 행에 적용하면 원하는 결과를 얻을 수 있습니다.