[백준] 1213번 - 팰린드롬 만들기

아이디어

팰린드롬
거꾸로 읽어도 제대로 읽는 것과 같은 문장이나 낱말, 숫자, 문자열

1) 입력받은 문자열을 (알파벳, 문자열에 알파벳이 들어있는 횟수)로 묶어서 집합을 만든다.
-> 이때, 횟수를 짝수, 홀수로 나누어서 분류해준다.
2) 만약, 홀수 횟수를 가지는 알파벳이 1개이상이라면 이는 팰린드롬이 될 수 없기 때문에 I'm Sorry Hansoo라는 문구를 출력해준다.
3) 홀수 횟수를 가지는 알파벳이 존재하고, 그 값이 1을 초과하는 경우에는 (횟수-1)만큼을 가진다고 가정하고 짝수 알파벳 집합에 추가해준다.
ex) ('A',3)일 경우에 1번은 가장 중앙에 출력되어야 하기 때문에 2번을 양쪽에 출력해주면 되는데, 이러한 과정은 짝수 집합에서 사전순 배열 후 처리해주면 되기 때문에 ('A',2)를 짝수횟수 집합에 추가해준다.
4) 짝수 횟수 집합을 사전순으로 정렬한다.
5) 사전순으로 정렬된 짝수 횟수 집합의 알파벳을 횟수의 절반만큼 저장해준다.
6) 팰린드롬은 대칭이여야 하기 때문에 이때까지 과정을 통해 만들어진 문자열을 역으로 저장해둔다.
7) 홀수 횟수 집합이 존재했다면, 문자열에 홀수 횟수가 나온 알파벳을 1회 붙여준다.
8) 역으로 저장해둔 문자열을 붙여준다.

코드

name = list(input())
count_even = list(set([(n,name.count(n)) for n in name if name.count(n) % 2 == 0 ]))
count_odd = list(set([(n,name.count(n)) for n in name if name.count(n) % 2 != 0 ]))

if len(count_odd) > 1:
    print("I'm Sorry Hansoo")
    exit()

str = ""
if count_odd:
    if count_odd[0][1] > 1:
        count_even.append((count_odd[0][0],count_odd[0][1]-1))

count_even.sort(key = lambda x : x[0])

for alpha in count_even:
    str += alpha[0] * (int(alpha[1]/2))

tmp_str = "".join(reversed(str))
if count_odd:
    str += count_odd[0][0]
str += tmp_str

print(str)

좋은 웹페이지 즐겨찾기