1213번 - 팰린드롬 만들기
우선 입력받은 문자열 크기가 홀수인지 짝수인지 먼저 판단했다.
-홀수라면 , 팰린드롬을 만들기 위해서 홀수인 알파벳 수가 무조건 1개 있어야 한다.
-짝수라면, 팰린드롬을 만들기 위해서 홀수 인 수가 있어서는 안된다.
위의 두 식을 통해서 일단, 팰린드롬이 생성되지 않는 경우를 차단했다.
그 다음에 makePal 함수를 통해서 A부터 차근차근 앞에서 채워서 반절을 만들어 냈다.
이때 만약 문자열 크기가 홀수라면, 홀 수 갯수를 가운데에 넣어주고, 그렇지 않다면
반절을 리버스 한걸 합해서 정답 코드를 출력해냈다.
<정답 코드>
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | #include<iostream> #include<string> #include<algorithm> using namespace std; char alphabet[27]; string makePal(int mid) { string half, half2; for (int i = 0; i < 27; i++) { while (alphabet[i] >= 2) { half += i + 'A'; half2 += i + 'A'; alphabet[i] -= 2; } } reverse(half2.begin(), half2.end()); if (mid != -1) { half += mid + 'A'; half += half2; return half; } else { half += half2; return half; } } int main() { string str; string ans; cin >> str; for (int i = 0; i < str.size(); i++) { alphabet[str[i] - 'A']++; } if (str.size() % 2 == 0) { for (int i = 0; i < 27; i++) { if (alphabet[i] % 2 == 1) { printf("I'm Sorry Hansoo\n"); return 0; } } ans=makePal(-1); } else { int holsoo = 0; int here; for (int i = 0; i < 27; i++) { if (alphabet[i] % 2 == 1) { here = i; holsoo++; } if (holsoo >= 2) { printf("I'm Sorry Hansoo\n"); return 0; } } ans=makePal(here); } cout << ans << endl; return 0; } | cs |
반응형