2번.
풀이전략
- string을 head, mid, tail로 구분함.
- 문제 흐름 상 홀수는 최소한 한번만 나와야함, 2개 이상 나오면, 종료
- tail을 어떻게 할 것인지가 관건이었음.
- 순차적으로 오는 알파벳의 경우, 앞에다가 해야함.
그래서 tail만 list로 한후, 최종 출력때 사용하는 식으로 하마.
코드
#include <iostream>
#include <string>
#include <map>
using namespace std;
#include <algorithm>
#include <list>
//팰린드롬/
// 카운팅으로 풀었을 때와
// map으로 풀었을 때의 시간을 측정해보자.
int main()
{
//홀수인 알파벳은 최소 1개가 있어야함.
// 2개이상일 경우, 종료
//사전 순이므로, 일단 정렬을 한후,,,
// 가장 앞선 것을 먼저 위치시켜야 함.
// 어제 생각했을 때는 head에다가 반절..
// tail에다가 반절인데
//만약 aaaabbbbcccc
// 일경우
//aabbcc ccbbaa 이므로.
// tail부분을 어떻게 처리할지 생각해야함.
//tail 부분을 aa 넣고 앞에다가 bb 앞에다가 cc 를 넣어야함.
string s;
cin >> s;
sort(s.begin(), s.end());
string head = "";
string tail = "";
string mid = "";
//카운팅 체크를 해야함.
//홀수가 있을 때 mid로 설정.
map<char, int>m;
for (auto iter : s)
{
m[iter]++;
}
int cnt = 0;
//카운팅
for (auto iter : m)
{
if (iter.second % 2 != 0)
{
++cnt;
mid = iter.first;
}
}
list<char>l;
if (cnt > 1)
cout << "I'm Sorry Hansoo";
else
{
// 알파벳 순으로 진행함.
for (auto iter : m)
{
for (int i = 0; i < iter.second / 2; ++i)
{
head += iter.first;
l.push_front(iter.first);
}
}
for(auto iter : head)
{
cout << iter;
}
cout << mid;
for (auto iter : l)
{
cout << iter;
}
}
}
1번.
풀이전략 1번
- 대문자만 있으므로 arr[] 카운팅 하는 방식으로 접근해야 함.
- 고심해보면,,, 카운팅 배열 중에서 두 개이상이 홀수가 나오면 불가함.
- list의 반복자는 += 증감 연산이 불가능하다라는 것을 알아야 함.
- 앞과 뒤를 삽입하고, 만약에 홀수개인 카운팅 배열은 중간 삽입을 한번 해야함.
-> c++ stl list 공부 필요
코드 1번
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
#include <list>
int main()
{
list<char>l;
int arr[26]{0,};
string word;
cin >> word;
for (char iter : word)
{
++arr[iter - 'A'];
}
//string result = "";
int cnt{ 0 };
// 홀수가 2개 이상이면 종료
// 홀수 처리는 나머지 연산자와 &연산자를 통해 찾을 수 있음.
for (int i = 25; i >= 0; --i)
{
//for (int k = 0; k < arr[i]; k += 2)
//{
// l.push_back(i + 'A');
// l.push_front(i + 'A');
//}
if ( ( arr[i] & 1 ) == 1)
{
++cnt;
if (cnt >= 2)
{
cout << "I'm Sorry Hansoo";
return 0;
}
// 가운데다가 넣어야 함...
//auto iter = l.begin() + l.size() / 2;
//l.insert( iter , i + 'A');
int a = l.size() / 2;
// 리스트는 랜덤 반복자가 아니므로, 인덱스 접근 불가능함...
auto iter = l.begin();
for (int l = 0; l < a; l++)
iter++;
l.insert(iter, i + 'A');
//카운팅은 여러개일 수도..
// 중간에 들어가야해
for (int k = 0; k < arr[i] - 1; k+= 2)
{
l.push_back(i + 'A');
l.push_front(i + 'A');
}
}
else if (arr[i] != 0)
{
// 앞 뒤로 넣자.
for (int k = 0; k < arr[i]; k += 2)
{
l.push_front(i + 'A');
l.push_back(i + 'A');
}
}
}
for (auto iter : l)
{
cout << iter;
}
}