백준 1213 - 팰린드롬 만들기
문제
임한수와 임문빈은 서로 사랑하는 사이이다.
임한수는 세상에서 팰린드롬인 문자열을 너무 좋아하기 때문에, 둘의 백일을 기념해서 임문빈은 팰린드롬을 선물해주려고 한다.
임문빈은 임한수의 영어 이름으로 팰린드롬을 만들려고 하는데, 임한수의 영어 이름의 알파벳 순서를 적절히 바꿔서 팰린드롬을 만들려고 한다.
임문빈을 도와 임한수의 영어 이름을 팰린드롬으로 바꾸는 프로그램을 작성하시오.
입력
첫째 줄에 임한수의 영어 이름이 있다. 알파벳 대문자로만 된 최대 50글자이다.
출력
첫째 줄에 문제의 정답을 출력한다. 만약 불가능할 때는 “I’m Sorry Hansoo”를 출력한다. 정답이 여러 개일 경우에는 사전순으로 앞서는 것을 출력한다.
팰린드롬 문제는 맞히긴 쉬워 보여도, 구현하는 방법은 생각보다 깔끔하지 않다. 주어진 문자열이 팰린드롬인지 아닌지 판별하는 건 쉽지만, 팰린드롬으로 재조립하는 과정은 다소 복잡하다.
구현해야 할 조건은 아래와 같다.
- 팰린드롬인지 아닌지 판단한다. 아니면
I'm Sorry Hansoo
를 출력한다. - 문자열 속 문자 개수를 파악한다. 최소 1개를 제외하곤 모두 짝수여야 한다.
- 문자열을 오름차순으로
개수//2
개씩 출력한 다음, 홀수 문자를 출력하고, 다시 내림차순으로개수//2
만큼 출력한다.
구현한 코드는 아래와 같다. 문자 개수를 세기 위해 collections
라이브러리의 Counter
함수를 사용했다. Counter
함수는 문자열 속 문자 개수를 가장 많은 것부터 내림차순으로 딕셔너리 형태로 반환해준다.
from collections import Counter
w = input()
l = Counter(w)
odd = ''
for key, val in l.items():
if val % 2 != 0:
odd += key
if len(odd) > 1: # 홀수개인 문자가 2개 이상이면 팰린드롬이 아님
print("I'm Sorry Hansoo")
else:
d = sorted(l.items()) # key를 기준으로 오름차순 정렬
for j in d:
print(j[0]*(j[1]//2), end='')
print(odd, end='')
for j in d[::-1]:
print(j[0]*(j[1]//2), end='')
[문제 보기]