2866.Β Beautiful Towers II

  • μ‹œκ°„ μ œν•œ 내에 λͺ» ν’€μ—ˆλ˜ 문제. μ‰½κ²Œ μƒκ°ν–ˆμœΌλ©΄ ν’€μ—ˆμ„ 것 같은데 λ„ˆλ¬΄ 경우의 수λ₯Ό 더 잘 μΆ”λ €λ‚΄λ €κ³  ν–ˆλ˜κ²Œ μ‹€μˆ˜μ˜€λ˜ 것 κ°™λ‹€.
  • 2865.Β Beautiful Towers I와 λ˜‘κ°™μ€ 문제인데 array의 길이가 인 점이 λ‹€λ₯΄λ‹€.
    • ν•œλ§ˆλ””λ‘œ λ§ν•˜λ©΄ 전체 경우의 수λ₯Ό λ‹€ μ‹œλ„ν•΄ λ³Ό 수 μ—†λ‹€λŠ” 것이닀.
    • λͺ¨λ“  경우의 수λ₯Ό λ‹€ μ‹œλ„ν•˜λ©΄ μ‹œκ°„ μ œν•œμ— κ±Έλ¦°λ‹€.
  • λ”°λΌμ„œ 전체 경우의 수 쀑 κ°€λŠ₯μ„± μžˆλŠ” index maxIndices λ₯Ό μΆ”λ €λ‚΄μ•Ό ν•œλ‹€.
  • 결과값을 μ΅œλŒ€ν™” ν•  수 μžˆλŠ” 후보 indexλŠ” maxHeights[index] 값이 peakκ°€ λ˜λŠ” 지점에 μžˆλŠ” λͺ¨λ“  index에 ν•΄λ‹Ήλœλ‹€.
  • λ†’μ΄μ˜ λ³€ν™” dir λ₯Ό μΆ”μ ν•˜μ—¬ 높이가 κ°μ†Œν•˜κ³  μžˆμ§€ μ•Šμ€ μƒνƒœ dir β‰  -1 β†’ κ°μ†Œν•˜λŠ” μƒνƒœ dir = -1 둜 λ³€ν™”ν•˜λŠ” 지점을 μ°ΎλŠ”λ‹€.
  • λ‚˜λ¨Έμ§€ 과정은 이전 λ¬Έμ œμ™€ λ™μΌν•˜λ‹€.
class Solution { public: long long maximumSumOfHeights(vector<int>& maxHeights) { vector<int> maxIndices; int dir = 0, prev = 0; for (int i = 0; i < maxHeights.size(); ++i) { int curr = maxHeights[i]; if (curr > prev) { dir = 1; } else if (curr < prev) { if (dir != -1) maxIndices.push_back(i - 1); dir = -1; } else { dir = 0; } prev = curr; } if (dir != -1) maxIndices.push_back(maxHeights.size() - 1); long long maxSum = 0; for (auto maxIndex : maxIndices) { int maxHeight = maxHeights[maxIndex]; long long sum = maxHeight; int curHeight = maxHeight; for (int i = maxIndex - 1; i >= 0; --i) { if (maxHeights[i] < curHeight) { curHeight = maxHeights[i]; } sum += curHeight; } curHeight = maxHeight; for (int i = maxIndex + 1; i < maxHeights.size(); ++i) { if (maxHeights[i] < curHeight) { curHeight = maxHeights[i]; } sum += curHeight; } if (sum > maxSum) maxSum = sum; } return maxSum; } };