2391. Minimum Amount of Time to Collect Garbage

  • 3개의 μ“°λ ˆκΈ° μ’…λ₯˜κ°€ 있으며 ν•œ λ²ˆμ— ν•œ μ’…λ₯˜ μ”© μ“°λ ˆκΈ° 수거 νŠΈλŸ­μ„ λ³΄λ‚΄μ„œ μ²˜λ¦¬ν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ˜ 합을 κ΅¬ν•˜λ©΄ λœλ‹€.
  • ν•œλ²ˆμ— ν•œ μ’…λ₯˜μ”© μˆ˜κ±°κ°€ κ°€λŠ₯ν•˜λ―€λ‘œ 각 μ“°λ ˆκΈ° μ’…λ₯˜λ₯Ό μˆ˜κ±°ν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ„ λ…λ¦½μ μœΌλ‘œ 계산할 수 μžˆλ‹€.
  • λ‹€λ§Œ μ“°λ ˆκΈ° 수거 트럭이 λͺ¨λ“  집을 λ°©λ¬Έν•΄μ•Ό ν•˜λŠ” 것은 μ•„λ‹ˆλ―€λ‘œ 이동 μ‹œκ°„ travel 의 합은 μ“°λ ˆκΈ° μ’…λ₯˜ λ³„λ‘œ λ‹€λ₯Ό 수 μžˆλŠ”λ° μ΄λŠ” prefixed sum 을 μ‚¬μš©ν•˜μ—¬ 미리 계산해 λ‘˜ 수 μžˆλ‹€.
  • 각 μ“°λ ˆκΈ° 수거 트럭이 λ°©λ¬Έν•΄μ•Ό λ˜λŠ” λ§ˆμ§€λ§‰ μ§‘μ˜ indexλ₯Ό κΈ°μ–΅ν•΄λ‘μ—ˆλ‹€κ°€ prefixed sum으둜 κ΅¬ν•œ ν•΄λ‹Ή μ§€μ κΉŒμ§€μ˜ 이동 거리 합을 결과에 λ”ν•˜λ©΄ λœλ‹€.
  • μ“°λ ˆκΈ°λ₯Ό μˆ˜κ±°ν•˜λŠ” μ‹œκ°„ μžμ²΄λ„ ꡳ이 μ“°λ ˆκΈ° μ’…λ₯˜ λ³„λ‘œ μ…€ ν•„μš” 없이 ν•΄λ‹Ή μ§‘μ˜ μ“°λ ˆκΈ° 숫자 garbage[i].length() λ₯Ό λ”ν•˜μ—¬ ν•œλ²ˆμ— ꡬ해도 λœλ‹€.
  • 이 문제λ₯Ό 쑰금 λ³€ν˜•ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같은 λ°©μ‹μœΌλ‘œ κ°€λŠ₯ν•  것 κ°™λ‹€.
    • μ“°λ ˆκΈ° μ’…λ₯˜κ°€ 3κ°€μ§€κ°€ μ•„λ‹Œ N가지인 경우
    • μ“°λ ˆκΈ° μ’…λ₯˜ λ³„λ‘œ μ„œλ‘œ λ‹€λ₯Έ 처리 μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” 경우
    • λ™μ‹œμ— 각 μ“°λ ˆκΈ° μ’…λ₯˜ 별 트럭이 μˆ˜κ±°ν•  수 μžˆλŠ” 경우
    • λ™μ‹œμ— 수거 κ°€λŠ₯ν•˜μ§€λ§Œ 같은 집을 λ°©λ¬Έν•˜λŠ” 경우 λ‚˜μ€‘μ— λ°©λ¬Έν•œ 트럭이 λŒ€κΈ°ν•΄μ•Ό ν•˜λŠ” 경우
enum GarbageType { Empty = 0, Metal = 1, Paper = 2, Glass = 4, }; inline GarbageType operator | (GarbageType lhs, GarbageType rhs) { return static_cast<GarbageType>( static_cast<int>(lhs) | static_cast<int>(rhs) ); } inline GarbageType operator & (GarbageType lhs, GarbageType rhs) { return static_cast<GarbageType>( static_cast<int>(lhs) & static_cast<int>(rhs) ); } class Solution { public: GarbageType checkType(string& garbage) { GarbageType type = Empty; for (auto g : garbage) { switch (g) { case 'M': type = type | Metal; break; case 'P': type = type | Paper; break; case 'G': type = type | Glass; break; } } return type; } int garbageCollection(vector<string>& garbage, vector<int>& travel) { int result = garbage[0].length(); vector<int> lastIndex(3, 0); for (int i = 1; i < travel.size(); ++i) { travel[i] += travel[i - 1]; } for (int i = 1; i < garbage.size(); ++i) { auto type = checkType(garbage[i]); result += garbage[i].length(); if (type & Metal) lastIndex[0] = i; if (type & Paper) lastIndex[1] = i; if (type & Glass) lastIndex[2] = i; } for (auto index : lastIndex) { if (index > 0) result += travel[index - 1]; } return result; } };