1727. Largest Submatrix With Rearrangements

  • 힌트λ₯Ό 봐도 이해가 잘 μ•ˆλ˜μ—ˆλ˜ 문제. μ’€ 더 κ³ λ―Όν•΄λ³΄λ‹ˆ column을 μž¬λ°°μ—΄ν•  λ•Œ μ–΄λ–€ rowλ₯Ό κΈ°μ€€μœΌλ‘œ ν•΄μ•Όν•˜λŠ”μ§€μ— λŒ€ν•œ 해닡을 κ΅¬ν•˜λŠ” λ¬Έμ œλΌλŠ” 생각이 λ“€μ—ˆλ‹€.
  • ν’€μ΄λŠ” μ•„λž˜μ™€ κ°™λ‹€.
    • 첫번째 row λΆ€ν„° μ‹œμž‘ν•˜μ—¬ 각 column에 μžˆλŠ” μ—°μ†λœ 숫자 1의 개수λ₯Ό λ”ν•΄λ‚˜κ°„λ‹€. 만일 ν˜„μž¬ column 값이 0이라면 λ”ν•˜μ§€ μ•Šκ³  0μΈμ±„λ‘œ κ·ΈλŒ€λ‘œ λ‘”λ‹€.
      • μ΄λ ‡κ²Œ κ³„μ‚°ν•˜λ©΄ νŠΉμ • row의 μœ„μΉ˜μ—μ„œ 각 column λ³„λ‘œ κ±Έμ³μžˆλŠ” μ—°μ†λœ 숫자 1의 개수λ₯Ό μ•Œ 수 μžˆλ‹€.
      notion image
    • κ·Έ λ‹€μŒ 각 rowλ₯Ό κΈ°μ€€μœΌλ‘œ μ˜μ—­μ˜ μ΅œλŒ€ 값을 κ΅¬ν•œλ‹€.
      • λ¨Όμ € row에 μžˆλŠ” column 별 μ—°μ†λœ 1의 개수λ₯Ό λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œλ‹€.
      • 첫번째 column λΆ€ν„° μ‹œμž‘ν•˜μ—¬ μ˜μ—­μ˜ 크기λ₯Ό κ³„μ‚°ν•˜κ³  κ·Έ 쀑에 μ΅œλŒ€ 값을 κ΅¬ν•œλ‹€.
      • ν˜„μž¬ column의 indexλ₯Ό c 라고 ν•  λ•Œ μ˜μ—­μ˜ ν¬κΈ°λŠ” μ•„λž˜μ˜ κ·Έλ¦Όκ³Ό 같이 (c + 1) * matrix[r][c] 둜 계산될 수 μžˆλ‹€.
      notion image
      class Solution { public: int largestSubmatrix(vector<vector<int>>& matrix) { int R = matrix.size(); int C = matrix[0].size(); int result = 0; for (int r = 1; r < R; ++r) { auto& prevRow = matrix[r - 1]; auto& row = matrix[r]; for (int c = 0; c < C; ++c) { if (row[c] != 0) row[c] += prevRow[c]; } } for (int r = 0; r < R; ++r) { auto& row = matrix[r]; sort(row.begin(), row.end(), greater<int>()); for (int c = 0; c < C && row[c] > 0; ++c) { result = max(result, (c + 1) * row[c]); } } return result; } };