✨ Algorithm

[λ°±μ€€/C++] 9375번: νŒ¨μ…˜μ™• μ‹ ν•΄λΉˆ

nitronium102 2022. 7. 10. 23:15

문제

ν•΄λΉˆμ΄λŠ” νŒ¨μ…˜μ— 맀우 λ―Όκ°ν•΄μ„œ ν•œλ²ˆ μž…μ—ˆλ˜ μ˜·λ“€μ˜ 쑰합을 μ ˆλŒ€ λ‹€μ‹œ μž…μ§€ μ•ŠλŠ”λ‹€. 예λ₯Ό λ“€μ–΄ 였늘 ν•΄λΉˆμ΄κ°€ μ•ˆκ²½, μ½”νŠΈ, μƒμ˜, μ‹ λ°œμ„ μž…μ—ˆλ‹€λ©΄, λ‹€μŒλ‚ μ€ λ°”μ§€λ₯Ό μΆ”κ°€λ‘œ μž…κ±°λ‚˜ μ•ˆκ²½λŒ€μ‹  렌즈λ₯Ό μ°©μš©ν•˜κ±°λ‚˜ ν•΄μ•Όν•œλ‹€. ν•΄λΉˆμ΄κ°€ κ°€μ§„ μ˜μƒλ“€μ΄ μ£Όμ–΄μ‘Œμ„λ•Œ κ³Όμ—° ν•΄λΉˆμ΄λŠ” μ•ŒλͺΈμ΄ μ•„λ‹Œ μƒνƒœλ‘œ λ©°μΉ λ™μ•ˆ 밖에 λŒμ•„λ‹€λ‹ 수 μžˆμ„κΉŒ?

μž…λ ₯

첫째 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ μ£Όμ–΄μ§„λ‹€. ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” μ΅œλŒ€ 100이닀.

  • 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 μ€„μ—λŠ” ν•΄λΉˆμ΄κ°€ κ°€μ§„ μ˜μƒμ˜ 수 n(0 ≤ n ≤ 30)이 μ£Όμ–΄μ§„λ‹€.
  • λ‹€μŒ nκ°œμ—λŠ” ν•΄λΉˆμ΄κ°€ κ°€μ§„ μ˜μƒμ˜ 이름과 μ˜μƒμ˜ μ’…λ₯˜κ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄ μ£Όμ–΄μ§„λ‹€. 같은 μ’…λ₯˜μ˜ μ˜μƒμ€ ν•˜λ‚˜λ§Œ μž…μ„ 수 μžˆλ‹€.

λͺ¨λ“  λ¬Έμžμ—΄μ€ 1이상 20μ΄ν•˜μ˜ μ•ŒνŒŒλ²³ μ†Œλ¬Έμžλ‘œ μ΄λ£¨μ–΄μ ΈμžˆμœΌλ©° 같은 이름을 κ°€μ§„ μ˜μƒμ€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄ ν•΄λΉˆμ΄κ°€ μ•ŒλͺΈμ΄ μ•„λ‹Œ μƒνƒœλ‘œ μ˜μƒμ„ μž…μ„ 수 μžˆλŠ” 경우λ₯Ό 좜λ ₯ν•˜μ‹œμ˜€.

 

풀이

map을 μ‚¬μš©ν•œ 문제

1. 각 μ˜μƒμ΄ λ“€μ–΄μ˜¬ λ•Œλ§ˆλ‹€ ν•΄λ‹Ή μ˜μƒμ˜ κ°€μ§“μˆ˜ +1

2. μ’…λ₯˜ 개수만큼 iterλ₯Ό λŒλ©΄μ„œ ν•΄λ‹Ή μ˜μƒμ„ μž…λŠ” κ²½μš°μ™€ μ•ˆ μž…λŠ” 경우λ₯Ό ν¬ν•¨ν•˜μ—¬ 계산

3. λ§ˆμ§€λ§‰μ— μ•ŒλͺΈμ΄ λ˜λŠ” 경우λ₯Ό μ œμ™Έ

#include <iostream>
#include <map>
using namespace std;

int main() {
    int n, t;
    string type, outfit;

    cin >> n;
    while(n--){
        cin >> t;

        // 옷의 μ’…λ₯˜, 숫자λ₯Ό μ €μž₯
        map<string, int> m;
        while (t--){
            cin >> outfit >> type;
            m[type]++;
        }

        // μ—°μ‚°
        int ans = 1;
        for (auto iter = m.begin(); iter != m.end(); iter++)
            ans *= (iter->second + 1);

        // μ•ŒλͺΈμΈ 경우 μ œμ™Έ
        cout << ans - 1 << "\n";
    }
}