Algorithm

[λ°±μ€€ 1213] νŒ°λ¦°λ“œλ‘¬ λ§Œλ“€κΈ°

osean 2023. 4. 16. 22:09

문제

λ°±μ€€ 1213

μž„ν•œμˆ˜μ™€ μž„λ¬ΈλΉˆμ€ μ„œλ‘œ μ‚¬λž‘ν•˜λŠ” 사이이닀.
μž„ν•œμˆ˜λŠ” μ„Έμƒμ—μ„œ νŒ°λ¦°λ“œλ‘¬μΈ λ¬Έμžμ—΄μ„ λ„ˆλ¬΄ μ’‹μ•„ν•˜κΈ° λ•Œλ¬Έμ—, λ‘˜μ˜ 백일을 κΈ°λ…ν•΄μ„œ μž„λ¬ΈλΉˆμ€ νŒ°λ¦°λ“œλ‘¬μ„ μ„ λ¬Όν•΄μ£Όλ €κ³  ν•œλ‹€.
μž„λ¬ΈλΉˆμ€ μž„ν•œμˆ˜μ˜ μ˜μ–΄ μ΄λ¦„μœΌλ‘œ νŒ°λ¦°λ“œλ‘¬μ„ λ§Œλ“€λ €κ³  ν•˜λŠ”λ°, μž„ν•œμˆ˜μ˜ μ˜μ–΄ μ΄λ¦„μ˜ μ•ŒνŒŒλ²³ μˆœμ„œλ₯Ό 적절히 λ°”κΏ”μ„œ νŒ°λ¦°λ“œλ‘¬μ„ λ§Œλ“€λ €κ³  ν•œλ‹€.
μž„λ¬ΈλΉˆμ„ 도와 μž„ν•œμˆ˜μ˜ μ˜μ–΄ 이름을 νŒ°λ¦°λ“œλ‘¬μœΌλ‘œ λ°”κΎΈλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

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

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

풀이

μ œμΆœν•œ μ½”λ“œ

아이디어

νŒ°λ¦°λ“œλ‘¬μœΌλ‘œ λ§Œλ“€ 수 μžˆλŠ” 경우

  • μž…λ ₯ν•œ λ¬Έμžμ—΄μ˜ 길이가 짝수인 경우, λ¬Έμžμ—΄μ— ν¬ν•¨λœ μ•ŒνŒŒλ²³μ˜ κ°œμˆ˜κ°€ λͺ¨λ‘ μ§μˆ˜μ—¬μ•Ό ν•œλ‹€.
  • μž…λ ₯ν•œ λ¬Έμžμ—΄μ˜ 길이가 ν™€μˆ˜μΈ 경우, 쀑간에 μœ„μΉ˜ν•œ μ•ŒνŒŒλ²³μ€ ν™€μˆ˜μ΄λ©΄μ„œ λ‚˜λ¨Έμ§€ μ•ŒνŒŒλ²³μ€ λͺ¨λ‘ μ§μˆ˜μ—¬μ•Ό ν•œλ‹€.

νŒ°λ¦°λ“œλ‘¬μœΌλ‘œ λ§Œλ“€ 수 μ—†λŠ” 경우

  • μž…λ ₯ν•œ λ¬Έμžμ—΄μ˜ 길이가 ν™€μˆ˜μΈ 경우, ν™€μˆ˜κ°œμΈ μ•ŒνŒŒλ²³ μ’…λ₯˜κ°€ 2개 이상이라면 νŒ°λ¦°λ“œλ‘¬μœΌλ‘œ λ§Œλ“€ 수 μ—†λ‹€.
  • μž…λ ₯ν•œ λ¬Έμžμ—΄μ˜ 길이가 짝수인 경우, ν™€μˆ˜κ°œμΈ μ•ŒνŒŒλ²³ μ’…λ₯˜κ°€ 1개 이상이라면 νŒ°λ¦°λ“œλ‘¬μœΌλ‘œ λ§Œλ“€ 수 μ—†λ‹€.

νŒ°λ¦°λ“œλ‘¬μœΌλ‘œ λ§Œλ“œλŠ” 방법

  • μ•ŒνŒŒλ²³ 별 개수λ₯Ό 담은 배열을 λ§Œλ“ λ‹€.
  • ν•΄λ‹Ή 배열을 μˆœνšŒν•˜λ©΄μ„œ
    • κ°œμˆ˜κ°€ ν™€μˆ˜μΈ κ²½μš°λŠ” 쀑간에 μœ„μΉ˜ν•΄μ•Ό ν•˜λŠ” μ•ŒνŒŒλ²³μ΄λ‹ˆ λ³„λ„λ‘œ μ €μž₯ν•œλ‹€.
    • μ•ŒνŒŒλ²³ 개수 / 2 만큼 순회λ₯Ό λŒλ©΄μ„œ prefix 와 suffix λ₯Ό λ§Œλ“ λ‹€.
  • μž…λ ₯ν•œ λ¬Έμžμ—΄μ΄
    • ν™€μˆ˜μΈ 경우
      • prefix + center + suffix
    • 짝수인 경우
      • prefix + suffix
#include <bits/stdc++.h>

using namespace std;

string input = "";
int alphabet[95] = {};

bool checkEven() {
    bool isEven = input.length() % 2 == 0;
    for (char c = 'A'; c <= 'Z'; c++) if (isEven && alphabet[c] % 2 != 0) return false;
    return true;
}

bool checkOdd() {
    bool isOdd = input.length() % 2 != 0;
    if (!isOdd) return true;
    int oddCnt = 0;
    for (char c = 'A'; c <= 'Z'; c++) {
        if (alphabet[c] % 2 != 0) oddCnt++;
        if (oddCnt > 1) return false;
    }
    return true;
}

string palindrome() {
    char center = ' ';
    string prefix = "";
    string suffix = "";
    for (char c = 'A'; c <= 'Z'; c++) {
        int size = alphabet[c];
        if (size % 2 != 0) center = c;
        for (int i = 0; i < size / 2; i++) {
            prefix += c;
            suffix = (c + suffix);
        }
    }
    if (center != ' ') return prefix + center + suffix;
    return prefix + suffix;
}

int main() {
    cin >> input;
    for (int i = 0; i < input.length(); i++) alphabet[input[i]]++;
    if (!checkEven() || !checkOdd()) cout << "I'm Sorry Hansoo";
    else cout << palindrome();
};