일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 누적 합
- 트리
- 백준
- Unreal Engine 5
- 유니온 파인드
- 스택
- 백트래킹
- Team Fortress 2
- 알고리즘
- XR Interaction Toolkit
- 그리디 알고리즘
- 브루트포스
- 자료구조
- 시뮬레이션
- 유니티
- 투 포인터
- BFS
- 그래프
- 다익스트라
- 우선순위 큐
- 재귀
- c++
- 구현
- 문자열
- 정렬
- VR
- 수학
- ue5
- 다이나믹 프로그래밍
- DFS
- Today
- Total
1일1알
백준 1213번 팰린드롬 만들기 C++ 본문
우선 홀수개인 알파벳의 개수가 2개 이상이면 팰린드롬을 만들 수 없기 때문에 이 경우에는 바로 "I'm Sorry Hansoo" 를 출력한다.
그리고 홀수개인 알파벳의 개수가 한개라면 이 경우에서는 알파벳이 n/2 , 1, n/2 로 나눠지고
나머지의 경우에는 알파벳이 n/2, n/2 로 나눠진다.
사전순서대로 저장해주는 map<char, int> 를 이용해 알파벳들을 저장하고 순회하면서 n/2만큼을 출력할 문자열에 붙여주고 남은 n/2는 스택에 넣어둔다. 그리고 홀수개인 알파벳이 하나가 있다면 n/2, 1, n/2의 중간의 1개의 알파벳을 저장해둔다.
홀수개인 알파벳이 있었다면 저장해둔 1개의 알파벳을 붙여두고 스택에서 빼가면서 출력할 문자열에 붙여준다.
ex) AABBCCCCC - A : 2개, B : 2개, C : 5개 - 홀수개인 알파벳이 C 하나이기 때문에 팰린드롬을 만들 수 있다.
AA : A, A로 나눠짐
BB : B, B로 나눠짐
CCCCC : CC , C, CC 로 나눠짐
map에 저장 : A : 2, B : 2, C : 5
출력 문자열 : ""
A 순회 -> 출력 문자열 : "A" , 스택 : (1, A)
B 순회 -> 출력 문자열 : "AB", 스택 : (1, A), (1, B)
C 순회 -> 출력 문자열 : "ABCC", 스택 : (1, A), (1, B), (2, C) , 저장할 알파벳 : C
홀수개인 알파벳이 있으므로 저장해둔 알파벳이 존재한다. -> 출력 문자열 : "ABCCC"
스택 순회 -> (2, C) -> 출력 문자열 : "ABCCCCC"
스택 순회 -> (1, B) -> 출력 문자열 : "ABCCCCCB"
스택 순회 -> (1, A) -> 출력 문자열 : "ABCCCCCBA"
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>
using namespace std;
using ll = long long;
void PushStr(string& str, char c, int cnt) {
for (int i = 0; i < cnt; i++) {
str += c;
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
map<char, int>mp;
string str;
cin >> str;
for (int i = 0; i < str.length(); i++) {
mp[str[i]]++;
}
int oddCnt = 0;
for (auto a : mp) {
if (a.second % 2 == 1) oddCnt++;
}
if (oddCnt > 1) {
cout << "I'm Sorry Hansoo";
}
else {
string ans = "";
stack<pair<char, int>> st;
char c;
for (auto a : mp) {
if (a.second % 2 == 1) c = a.first;
PushStr(ans, a.first, a.second / 2);
st.push({ a.first,a.second / 2 });
}
if (oddCnt == 1) ans += c;
while (!st.empty()) {
auto top = st.top();
st.pop();
PushStr(ans, top.first, top.second);
}
cout << ans;
}
};
'알고리즘' 카테고리의 다른 글
백준 1244번 스위치 켜고 끄기 C++ (0) | 2022.04.17 |
---|---|
백준 1235번 학생 번호 C++ (0) | 2022.04.16 |
백준 1113번 수영장 만들기 C++ (0) | 2022.04.14 |
백준 1195번 킥다운 C++ (0) | 2022.04.12 |
백준 1063번 킹 C++ (0) | 2022.04.11 |