포스트

Pr.1213 팰린드롬 만들기

Pr.1213 팰린드롬 만들기

문제

임한수와 임문빈은 서로 사랑하는 사이이다.</br> 임한수는 세상에서 팰린드롬인 문자열을 너무 좋아하기 때문에, 둘의 백일을 기념해서 임문빈은 팰린드롬을 선물해주려고 한다.</br> 임문빈은 임한수의 영어 이름으로 팰린드롬을 만들려고 하는데, 임한수의 영어 이름의 알파벳 순서를 적절히 바꿔서 팰린드롬을 만들려고 한다.</br> 임문빈을 도와 임한수의 영어 이름을 팰린드롬으로 바꾸는 프로그램을 작성하시오.</br>

입력

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

출력

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

예제 입력

1
AABB

예제 출력

1
ABBA

풀이과정

전제조건

  1. 시간 복잡도, 공간 복잡도
    • 시간 복잡도 : 스택 top비교 O(1)
  2. 최대, 최소 조건
    • 주어진 글자수 50개
  3. 사용 알고리즘
    • stack 자료 구조를 사용하여 pair일 경우 pop
    • sort(string.begin(), string.end())를 사용하여 정렬
    • stack()사용법

    | 구조 | 설명 | |—————–|———-| | stack stk | 스택선언 | | stack.push(T t) | 스택 삽입 | | stack.pop() | 스택 빼기 | | stack.top() | 최상단 스택빼기 | | stack.empty() | 빈 스택 확인 | | stack.size() | 스택크기 | - empty()를 항상 확인하고 pop()을 사용해야 한다.

  4. 반례, 경계값
    • 홀수 개의 경우 => 스택의 사이즈가 1초과 일때만 불가능, 1일때는 가운데 글자 1개

제출 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<bits/stdc++.h>
using namespace std;

string s, ret, temp;
stack<char> stk;

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

    cin >> s;
    sort(s.begin(), s.end());

    for(int i = 0; i < s.size(); i++){
        if(!stk.empty() && stk.top() == s[i]){
            ret += s[i];
            stk.pop();
        } else {
            stk.push(s[i]);
        }
    }

    if (stk.size() > 1){
        cout << "I'm Sorry Hansoo\n";
    }else{
        temp = ret;
        reverse(temp.begin(), temp.end());
        if(!stk.empty()) ret = ret + stk.top();
        cout << ret+temp << '\n';
    }

    return 0;
}

해설

생각해볼 점

  • stack, sort를 사용하지 않고, 알파벳 카운팅을 사용
  • 홀수의 문자열은 1번 이하로 나와야 한다.

수정방안

  • 문자열을 카운팅
  • Z부터 시작하여 A까지 꺼내면서 홀수체크 ret 만들기

정답 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<bits/stdc++.h>
using namespace std;

string s, ret; 
int cnt[200], flag; 
char mid;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    cin >> s;
	for(char a : s)cnt[a]++;
    
    for(int i = 'Z'; i >= 'A'; i--){
        if(cnt[i]){
            if(cnt[i] & 1){
                flag++; cnt[i]--;
                mid = (char)i;
            }
        
            if(flag == 2) break;
        
            for (int j = 0; j < cnt[i]; j+=2){
                ret = (char)i+ret;
                ret += (char)i;
            }
        }
    }
    
    if(mid)ret.insert(ret.begin() + ret.size() / 2, mid);
    if(flag == 2) cout << "I'm Sorry Hansoo" <<'\n';
    else cout << ret << '\n';
    return 0; 
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.