2033. Minimum Operations to Make a Uni-Value Grid

Jeong-yun Lee·2025년 3월 26일

LeetCode

목록 보기
16/16


📘 0. 문제: 모든 원소를 동일하게 만들기 (Uni-value Grid)

🧾 문제 설명

m x n 크기의 2차원 정수 배열 grid와 정수 x가 주어짐.
한 번의 연산으로 grid 내 아무 원소에 x를 더하거나 뺄 수 있음.

uni-value grid란?
→ 모든 원소가 동일한 값을 가지는 그리드를 의미함.


🎯 목표

모든 원소가 같은 값이 되도록 만들기 위해
필요한 최소 연산 횟수를 구하라.

  • 만약 어떤 원소도 동일한 값으로 만들 수 없다면 → -1을 반환

💡 예제

예제 1

입력: grid = [[2,4],[6,8]], x = 2
출력: 4
설명:
모든 원소를 4로 만들 수 있음:
- 2에 x를 한 번 더함 → 4
- 6에서 x를 한 번 뺌 → 4
- 8에서 x를 두 번 뺌 → 4
총 연산 횟수 = 4

예제 2

입력: grid = [[1,5],[2,3]], x = 1
출력: 5
설명:
모든 원소를 3으로 만들 수 있음

예제 3

입력: grid = [[1,2],[3,4]], x = 2
출력: -1
설명:
어떤 값을 기준으로도 모든 원소를 동일하게 만들 수 없음

📌 제한 조건

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 10⁵
  • 1 <= m * n <= 10⁵
  • 1 <= x, grid[i][j] <= 10⁴

✒️ 1. 풀이

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;
  }
}
profile
push hard 🥕

0개의 댓글