
m x n 크기의 2차원 정수 배열 grid와 정수 x가 주어짐.
한 번의 연산으로 grid 내 아무 원소에 x를 더하거나 뺄 수 있음.
uni-value grid란?
→ 모든 원소가 동일한 값을 가지는 그리드를 의미함.
모든 원소가 같은 값이 되도록 만들기 위해
필요한 최소 연산 횟수를 구하라.
-1을 반환입력: grid = [[2,4],[6,8]], x = 2
출력: 4
설명:
모든 원소를 4로 만들 수 있음:
- 2에 x를 한 번 더함 → 4
- 6에서 x를 한 번 뺌 → 4
- 8에서 x를 두 번 뺌 → 4
총 연산 횟수 = 4
입력: grid = [[1,5],[2,3]], x = 1
출력: 5
설명:
모든 원소를 3으로 만들 수 있음
입력: grid = [[1,2],[3,4]], x = 2
출력: -1
설명:
어떤 값을 기준으로도 모든 원소를 동일하게 만들 수 없음
m == grid.lengthn == grid[i].length1 <= m, n <= 10⁵1 <= m * n <= 10⁵1 <= x, grid[i][j] <= 10⁴class Solution {
public int minOperations(int[][] grid, int x) {
// grid의 각 원소를 x로 나누었을 때의 나머지가 모두 같아야 uni-value grid 가능.
// 최소 연산을 위해서는 중앙값을 기준으로 나머지가 맞추면 됨.
int[] series = new int[grid.length * grid[0].length];
int dividend = grid[0][0] % x;
// series에 모든 숫자 1차원 배열에 삽입
// 모든 숫자를 x와 나누었을 때의 나머지가 모두 동일한지 검증
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
series[i * grid[0].length + j] = grid[i][j];
if (grid[i][j] % x != dividend)
return -1;
}
}
// 중앙값 찾기 위해 정렬
Arrays.sort(series);
int median = (series.length / 2);
각 원소별로 중앙값과의 차이를 계산해서 x를 몇번 더하거나 빼야하는지 연산 횟수 누적합
int totalOps = 0;
for (int i = 0; i < series.length; i++) {
totalOps += Math.abs((series[median] - series[i]) / x);
}
return totalOps;
}
}