## 문제

문자열이 주어지면 펠린드롬으로 만들면 된다.

펠린드롬이 뭔지 문제에 알려주지 않았는데. 좌우대칭이면 펠린드롬이다.(거꾸로 읽어도 같은 문자열)


## code

n = input()
l = list(n)

# 조건 - 사전순으로 앞서는것 출력
# 일단 개수를 세서 홀수인것이 하나인지 확인을 해야 한다
# 하나가 넘으면 불가

# 문자와 문자 개수 체크하여 dict에 넣기
d = {}
for tmp in l:
    d[tmp] = d.get(tmp,0) + 1

isError = None
oddkey = ''
oddvalue = 0
for k,v in d.items():
    if v%2 == 1:
        oddkey = k
        oddvalue += 1
        if oddvalue > 1:
            isError = True
            break

if isError:
    print('I\'m Sorry Hansoo')
else:
    # 전체 순회하여 value값을 절반으로 줄이고 oddkey의 value는 1 더 줄인다
    for k,v in d.items():
        if k == oddkey:
            v -= 1
        d[k] = v//2
   
    # value 수만큼 list에 넣고 정렬하고, oddkey 더하고 뒤집어서 더하면 됨
    ans_half = []
    for k,v in d.items():
        for tmp in range(v):
            ans_half += [k]
        ans_half.sort()

    ans = ''.join(ans_half) + oddkey + ''.join(ans_half[::-1])
    print(ans)

먼저 주어진 문자열에서 홀수인 문자의 개수가 1개 이하인지 찾아야 한다.

1개를 넘을경우 펠린드롬을 만들수 없다.


펠린드롬을 만들 수 있다면 홀수인 문자가 무엇인지 체크하고 그 문자 1개는 제외한다.

그리고 전체 문자를 count 한것을 절반으로 줄이고, 그것을 정렬한다.(사전순으로 앞서는것 출력)

원하는 결과는 (정렬한것) + (홀수개인 문자 하나, 없다면 빈 문자) + (정렬한것의 역순) 이다.


from collections import Counter
S=list(input())
C,c,M=Counter(S),0,''
for i in C:
    if C[i]%2:
        M=i
        c+=1
R=sorted([i*(C[i]//2) for i in set(S)])
print([''.join(R+[M]+R[::-1]),"I'm Sorry Hansoo"][c>1])

꼭 dict를 쓸 필요는 없다. 코드가 조금 길어져도 상관 없다면 dict 쓰는게 편하긴 한데

collections 모듈의 counter 클래스를 사용시 각 원소가 몇번 나오는지 저장된 객체를 얻게 된다(dict 형태로)

https://www.daleseo.com/python-collections-counter/

결국 dict 쓰는것과 똑같다.