✨ Algorithm

[λ°±μ€€/C++] 1213번: νŒ°λ¦°λ“œλ‘¬ λ§Œλ“€κΈ°

nitronium102 2022. 7. 24. 23:46

문제

μž„ν•œμˆ˜μ™€ μž„λ¬ΈλΉˆμ€ μ„œλ‘œ μ‚¬λž‘ν•˜λŠ” 사이이닀. μž„ν•œμˆ˜λŠ” μ„Έμƒμ—μ„œ νŒ°λ¦°λ“œλ‘¬μΈ λ¬Έμžμ—΄μ„ λ„ˆλ¬΄ μ’‹μ•„ν•˜κΈ° λ•Œλ¬Έμ—, λ‘˜μ˜ 백일을 κΈ°λ…ν•΄μ„œ μž„λ¬ΈλΉˆμ€ νŒ°λ¦°λ“œλ‘¬μ„ μ„ λ¬Όν•΄μ£Όλ €κ³  ν•œλ‹€.

μž„λ¬ΈλΉˆμ€ μž„ν•œμˆ˜μ˜ μ˜μ–΄ μ΄λ¦„μœΌλ‘œ νŒ°λ¦°λ“œλ‘¬μ„ λ§Œλ“€λ €κ³  ν•˜λŠ”λ°, μž„ν•œμˆ˜μ˜ μ˜μ–΄ μ΄λ¦„μ˜ μ•ŒνŒŒλ²³ μˆœμ„œλ₯Ό 적절히 λ°”κΏ”μ„œ νŒ°λ¦°λ“œλ‘¬μ„ λ§Œλ“€λ €κ³  ν•œλ‹€.

μž„λ¬ΈλΉˆμ„ 도와 μž„ν•œμˆ˜μ˜ μ˜μ–΄ 이름을 νŒ°λ¦°λ“œλ‘¬μœΌλ‘œ λ°”κΎΈλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 μž„ν•œμˆ˜μ˜ μ˜μ–΄ 이름이 μžˆλ‹€. μ•ŒνŒŒλ²³ λŒ€λ¬Έμžλ‘œλ§Œ 된 μ΅œλŒ€ 50κΈ€μžμ΄λ‹€.

좜λ ₯

첫째 쀄에 문제의 정닡을 좜λ ₯ν•œλ‹€. λ§Œμ•½ λΆˆκ°€λŠ₯ν•  λ•ŒλŠ” "I'm Sorry Hansoo"λ₯Ό 좜λ ₯ν•œλ‹€. 정닡이 μ—¬λŸ¬ 개일 κ²½μš°μ—λŠ” μ‚¬μ „μˆœμœΌλ‘œ μ•žμ„œλŠ” 것을 좜λ ₯ν•œλ‹€.

풀이

νŒ°λ¦°λ“œλ‘¬μˆ˜λŠ” part1 + part2 + part3 (part1의 λŒ€μΉ­)으둜 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€. 

λ¨Όμ € 각 μ•ŒνŒŒλ²³μ˜ 수λ₯Ό μ„Ό ν›„, 사전 순으둜 μ½μ–΄κ°€λ©΄μ„œ part1κ³Ό part3에 ν•˜λ‚˜μ”© ν• λ‹Ήν•œλ‹€. 

λ§Œμ•½ μ•ŒνŒŒλ²³μ˜ μˆ˜κ°€ ν™€μˆ˜μΈ 경우, part2에 ν• λ‹Ήν•œλ‹€. κ·ΈλŸ¬λ‚˜ part2κ°€ 이미 μ‘΄μž¬ν•œλ‹€λ©΄ νŒ°λ¦°λ“œλ‘¬μ΄ λΆˆκ°€λŠ₯ν•˜λ‹€. (λŒ€μΉ­ λΆˆκ°€)

#include <iostream>
using namespace std;

int alphabet[26] = {0,};

/*
 *  λŒ€μΉ­λ¬Έμžμ—΄ + 쀑간 문자(0~1κΈ€μž) + λŒ€μΉ­λ¬Έμžμ—΄
 *  1. 각 μ•ŒνŒŒλ²³μ΄ λͺ‡ κ°œμΈμ§€ μ €μž₯
 *  2. 사전 순으둜 μ•žμ„  νŽ λ¦°λ“œλ‘¬ 수 생성 -> λŒ€μΉ­ λ¬Έμžμ—΄μ— ν•˜λ‚˜μ”© ν• λ‹Ή
 *  3. λ§Œμ•½ μ•ŒνŒŒλ²³μ˜ μˆ˜κ°€ ν™€μˆ˜μΈ 경우, 쀑간 λ¬Έμžμ— ν• λ‹Ή. λ§Œμ•½ 이미 쀑간 λ¬Έμžκ°€ μžˆλ‹€λ©΄ νŒ°λ¦°λ“œλ‘¬ λΆˆκ°€ 좜λ ₯
 */
string makePelindrome() {
    string part1 = "", part2 = "", part3 = "";
    for (int i = 0; i < 26; i++) {
        if (alphabet[i] % 2 == 1) {
            if (part2.size() == 1)
                return "I'm Sorry Hansoo";
            part2 = (char) (i + 'A');
        }
        for (int j = 0; j < alphabet[i] / 2; j++) {
            part1 += (char) (i + 'A');
            part3 = (char) (i + 'A') + part3; // λŒ€μΉ­μœΌλ‘œ 더해져야 ν•˜κΈ° λ•Œλ¬Έμ— +=λ₯Ό μ“°λ©΄ μ•ˆ λœλ‹€!
        }
    }
    return part1 + part2 + part3;
}

int main() {
    string name;
    cin >> name;

    // 1번 : μ•ŒνŒŒλ²³ 개수 μ €μž₯
    for (int i = 0; i < name.length(); i++)
        alphabet[name[i] - 'A']++;

    // 2번 : νŒ°λ¦°λ“œλ‘¬ 수 생성
    cout << makePelindrome();
}