135. Candy

  • 이 λ¬Έμ œλŠ” ratings 값이 μ–΄λ–€ μ‹μœΌλ‘œ 배치 λ˜μ–΄ μžˆλŠ”κ°€μ— λ”°λΌμ„œ 각 아이듀이 받을 수 μžˆλŠ” μ΅œλŒ€ μΏ ν‚€μ˜ μˆ˜κ°€ λ³€ν•œλ‹€λŠ” 점 λ•Œλ¬Έμ— ν’€κΈ°κ°€ μ’€ μ–΄λ €μ› λ‹€.
  • 기본적인 κ΄€μ°°λ‘œ 얻은 κ·œμΉ™μ€ μ•„λž˜μ™€ κ°™λ‹€.
    • μ μˆ˜κ°€ μ—°μ†μœΌλ‘œ 증가 up ν•  경우 각 아이듀이 λ°›μ•„μ•Ό 될 μΏ ν‚€μ˜ μˆ˜λ„ 1κ°œμ”© μ¦κ°€ν•œλ‹€.
    • λ§ˆμ°¬κ°€μ§€λ‘œ μ μˆ˜κ°€ μ—°μ†μœΌλ‘œ κ°μ†Œ down ν•  경우 각 아이듀이 λ°›μ•„μ•Ό 될 μΏ ν‚€μ˜ μˆ˜λŠ” 1κ°œμ”© κ°μ†Œν•œλ‹€.
  • λ¬Έμ œλŠ” μ μˆ˜κ°€ μ—°μ†μœΌλ‘œ 증가 up ν•˜λ‹€κ°€ 이후 μ—°μ†μœΌλ‘œ κ°μ†Œ down ν•  경우 변곑점에 μœ„μΉ˜ν•œ 아이가 λ°›μ•„μ•Ό 될 μΏ ν‚€μ˜ μˆ˜λŠ” λ‹¨μˆœνžˆ μ—°μ†μœΌλ‘œ μ¦κ°€ν•œ 숫자 up 둜 κ²°μ •λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 점이닀.
    • 변곑점에 μœ„μΉ˜ν•œ μ•„μ΄μ˜ μΏ ν‚€ μˆ˜λŠ” up > down 이면 up + 1, up < down 이면 down + 1이 λœλ‹€.
notion image
  • μœ„μ˜ 관찰을 λ°”νƒ•μœΌλ‘œ μ—°μ†μœΌλ‘œ 증가 β†’ μ—°μ†μœΌλ‘œ κ°μ†Œν•˜λŠ” νŒ¨ν„΄μ˜ μΏ ν‚€ 수λ₯Ό κ³„μ‚°ν•˜λ €λ©΄ Solution::calculate 둜직과 같이 ν•˜λ©΄ λœλ‹€.
  • 만일 μ—°μ†μœΌλ‘œ 증가 β†’ μ—°μ†μœΌλ‘œ κ°μ†Œν•˜λŠ” νŒ¨ν„΄μ΄ 반볡되면 μ–΄λ–»κ²Œ ν•΄μ•Ό 될까?
    • μ—°μ†μœΌλ‘œ 증가 β†’ μ—°μ†μœΌλ‘œ κ°μ†Œν•˜λŠ” νŒ¨ν„΄μ΄ 반볡될 경우 νŒ¨ν„΄κ³Ό νŒ¨ν„΄μ΄ κ²ΉμΉ˜λŠ” 지점 (κ°μ†Œ β†’ 증가가 λ˜λŠ” 변곑점)의 μΏ ν‚€ μˆ«μžλŠ” 겹치게 λ˜λ―€λ‘œ ν•΄λ‹Ή 숫자 overlap 만큼 λΉΌμ£Όμ–΄μ•Ό ν•œλ‹€.
    • 만일 νŒ¨ν„΄κ³Ό νŒ¨ν„΄ 사이에 λ™μΌν•œ 값이 λ°˜λ³΅λœλ‹€λ©΄ νŒ¨ν„΄μ΄ κ²ΉμΉ˜μ§€ μ•Šκ²Œ λ˜λ―€λ‘œ overlapμ—μ„œλŠ” μ œμ™Έν•œλ‹€.
notion image
  • μ—°μ†μœΌλ‘œ 증가 β†’ μ—°μ†μœΌλ‘œ κ°μ†Œ νŒ¨ν„΄μ„ μ°Ύμ•„λ‚΄κΈ° μœ„ν•΄μ„œ 이전에 μ—°μ†μœΌλ‘œ κ°μ†Œν•˜λŠ” νŒ¨ν„΄μ΄μ—ˆλŠ”μ§€ 좔적할 ν•„μš”κ°€ μžˆλ‹€ isDown.
    • 이λ₯Ό λ°”νƒ•μœΌλ‘œ νŒ¨ν„΄μ˜ μ‹œμž‘μ  up & isDown == true 및 이전과 λ™μΌν•œ 값이 μΆœν˜„ν•œ 경우 prev == curr 에 νŒ¨ν„΄μ˜ μΏ ν‚€ 숫자λ₯Ό κ³„μ‚°ν•˜λ©΄ λœλ‹€.
  • λ§Œμ•½ 같은 값이 κ³„μ†ν•΄μ„œ λ°˜λ³΅λœλ‹€λ©΄ μœ„μ™€ 같은 νŒ¨ν„΄μ΄ λ°œμƒν•˜μ§€ μ•Šμ•˜λ‹€λŠ” μ˜λ―Έμ΄λ―€λ‘œ μ΅œμ†Œμ˜ μΏ ν‚€ 값인 1개λ₯Ό λ”ν•΄μ£Όλ©΄λœλ‹€.
    • Solution::calculate의 첫번째 라인 뢀뢄에 ν•΄λ‹Ήν•œλ‹€.
class Solution { public: static inline int calculate(int up, int down) { if (up == 0 && down == 0) return 1; if (up > down) ++up; else ++down; return up * (up + 1) / 2 + down * (down + 1) / 2; } int candy(vector<int>& ratings) { int result = 0; int overlap = 0; bool isDown = false; int up = 0; int down = 0; int prev = ratings[0]; for (int i = 1; i < ratings.size(); ++i) { int curr = ratings[i]; if (prev < curr) { if (isDown) { result += calculate(up, down); up = down = 0; isDown = false; ++overlap; } ++up; } else if (prev > curr) { ++down; isDown = true; } else { result += calculate(up, down); isDown = false; up = down = 0; } prev = curr; } result += calculate(up, down); return result - overlap; } };