[C++] 백준(BOJ) - 1213 : 팰린드롬 만들기

인프런에 있는 큰돌님의 강의 10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트를 듣고 정리한 필기입니다.

문제

백준(BOJ) - 1213 : 팰린드롬 만들기(링크)

임한수와 임문빈은 서로 사랑하는 사이이다.

임한수는 세상에서 팰린드롬인 문자열을 너무 좋아하기 때문에, 둘의 백일을 기념해서 임문빈은 팰린드롬을 선물해주려고 한다.

임문빈은 임한수의 영어 이름으로 팰린드롬을 만들려고 하는데, 임한수의 영어 이름의 알파벳 순서를 적절히 바꿔서 팰린드롬을 만들려고 한다.

임문빈을 도와 임한수의 영어 이름을 팰린드롬으로 바꾸는 프로그램을 작성하시오.

입력

첫째 줄에 임한수의 영어 이름이 있다. 알파벳 대문자로만 된 최대 50글자이다.

출력

첫째 줄에 문제의 정답을 출력한다. 만약 불가능할 때는 “I’m Sorry Hansoo”를 출력한다. 정답이 여러 개일 경우에는 사전순으로 앞서는 것을 출력한다.

알고리즘

  1. 구현
  2. 문자열
  3. 그리디

풀이

  • 팰린드롬이 안되는 경우의 수를 먼저 확인
    • 홀수가 두개 이상이면 팰린드롬을 만들 수 없다
    • 팰린드롬을 오름차순으로 정렬하기 위해서는 입력받은 문자열의 큰 알파벳 부터 중간부터 정답을 만들어 나가야한다 (그리디)
  • 홀수로 들어온 알파벳이 있다면 그 문자를 팰린드롬 중앙에 삽입 해준다

코드

// BOJ - 1213 : 팰린드롬 만들기
#include <bits/stdc++.h>
using namespace std;

int alpha[200], flag;
char mid;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    string str, res;
    cin >> str;

    for (char a : str) alpha[a]++;

    for (int i = 'Z'; i >= 'A'; i--)
    {
        if (alpha[i])
        {
            if (alpha[i] & 1) // 홀수 체크
            {
                mid = char(i); // 홀수로 들어온 알파벳 임시 저장
                flag++;
                alpha[i]--;
            }

            if (flag == 2) break; // 홀수 알파벳이 두개 이상 -> 팰린드롬 조건 성립X
            for (int j = 0; j < alpha[i]; j += 2)
            {
                res = char(i) + res;
                res += char(i);
            }
        }
    }

    // 홀수로 하나로 들어온 수를 나중에 삽입
    if (mid) res.insert(res.begin() + res.size() / 2, mid);
    if (flag == 2) cout << "I'm Sorry Hansoo\n";
    else cout << res << '\n';

    return 0;
}

평가

  • 홀수 체크를 하기 위해 비트 연산자(&)를 활용
  • 오름차순 정렬을 위해 알파벳 Z부터 반복문을 돌리며 정답을 만들어 나간다 - 그리디 알고리즘
  • string - insert 메서드 활용

© 2023 Jinsoo Lee. All rights reserved.

Powered by Hydejack v9.1.6