Pr.1213 팰린드롬 만들기
Pr.1213 팰린드롬 만들기
문제
임한수와 임문빈은 서로 사랑하는 사이이다.</br> 임한수는 세상에서 팰린드롬인 문자열을 너무 좋아하기 때문에, 둘의 백일을 기념해서 임문빈은 팰린드롬을 선물해주려고 한다.</br> 임문빈은 임한수의 영어 이름으로 팰린드롬을 만들려고 하는데, 임한수의 영어 이름의 알파벳 순서를 적절히 바꿔서 팰린드롬을 만들려고 한다.</br> 임문빈을 도와 임한수의 영어 이름을 팰린드롬으로 바꾸는 프로그램을 작성하시오.</br>
입력
첫째 줄에 임한수의 영어 이름이 있다. 알파벳 대문자로만 된 최대 50글자이다.
출력
첫째 줄에 문제의 정답을 출력한다. 만약 불가능할 때는 “I’m Sorry Hansoo”를 출력한다. 정답이 여러 개일 경우에는 사전순으로 앞서는 것을 출력한다.
예제 입력
1
AABB
예제 출력
1
ABBA
풀이과정
전제조건
- 시간 복잡도, 공간 복잡도
- 시간 복잡도 : 스택 top비교 O(1)
- 최대, 최소 조건
- 주어진 글자수 50개
- 사용 알고리즘
- 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()을 사용해야 한다. - 반례, 경계값
- 홀수 개의 경우 => 스택의 사이즈가 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 라이센스를 따릅니다.