## 문제
문자열이 주어지면 펠린드롬으로 만들면 된다.
펠린드롬이 뭔지 문제에 알려주지 않았는데. 좌우대칭이면 펠린드롬이다.(거꾸로 읽어도 같은 문자열)
## 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 쓰는것과 똑같다.
0 댓글