하나의 m x n 행렬이 있다고 가정합니다. 및 또 다른 값 k. 여기서 행렬의 좌표(a, b) 값은 모든 행렬[i, j]의 XOR입니다. 여기서 i는 범위(0~a)이고 j는 범위(0~b)입니다. 행렬의 모든 좌표 중 k번째로 큰 값(1-indexed)을 찾아야 합니다.
따라서 입력이 다음과 같으면
5 | 2 |
1 | 6 |
그리고 k =1이면 좌표 (0,1)의 값이 5 XOR 2 =7이고 이것이 가장 큰 값이기 때문에 출력은 7이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- m :=행 개수, n :=열 개수
- 0 ~ m - 1 범위의 i에 대해
- 0 ~ n - 1 범위의 j에 대해 다음을 수행합니다.
- j가 0이 아니면
- 행렬[i, j] :=행렬[i, j] XOR 행렬[i, j-1]
- j가 0이 아니면
- 0 ~ n - 1 범위의 j에 대해 다음을 수행합니다.
- 본 :=새 지도
- 카운트:=0
- 0 ~ n - 1 범위의 i에 대해
- 0 ~ m - 1 범위의 j에 대해
- j가 0이 아니면
- 행렬[j, i] :=행렬[j, i] XOR 행렬[j-1, i]
- seen[matrix[j, i]] =(1+seen[matrix[j, i]] 가능하면 1)
- 카운트 :=카운트 + 1
- 만약 count> k이면
- min_value :=본 것 중 최소값
- 본[최소값] :=본[최소값] - 1
- 본[최소값]이 0이면
- 표시된 항목에서 min_value-th 요소 삭제
- j가 0이 아니면
- 0 ~ m - 1 범위의 j에 대해
- 최소값 반환
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
def solve(matrix, k): m, n = len(matrix), len(matrix[0]) for i in range(m): for j in range(n): if j: matrix[i][j] ^= matrix[i][j-1] seen = {} count = 0 for i in range(n): for j in range(m): if j: matrix[j][i] ^= matrix[j-1][i] seen[matrix[j][i]] = seen.get(matrix[j][i], 0) + 1 count += 1 if count > k: min_value = min(seen) seen[min_value] -= 1 if not seen[min_value]: seen.pop(min_value) return min(seen) matrix = [[5,2],[1,6]] k = 1 print(solve(matrix, k))
입력
[[5,2],[1,6]], 1
출력
7