알고리즘

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

담쏙 2021. 10. 10. 12:06
728x90

https://www.acmicpc.net/problem/1213

 

1213번: 팰린드롬 만들기

첫째 줄에 문제의 정답을 출력한다. 만약 불가능할 때는 "I'm Sorry Hansoo"를 출력한다. 정답이 여러 개일 경우에는 사전순으로 앞서는 것을 출력한다.

www.acmicpc.net

주어진 문자열을 가지고 팰린드롬, 즉 '회문'을 만드는 것이다. 회문은 수박이박수, 다시합창합시다 같이 앞으로 읽어도 거꾸로 읽어도 똑같은 문자열이다.

 

이러한 회문을 만들기 위해서 홀수개의 알파벳은 0~1개여야만 하다. 일단 각 알파벳을 key로 하고, 알파벳의 개수를 value로 하는 딕셔너리를 만들어준다.

 

palindrome 함수를 이용하여 딕셔너리의 key, value를 꺼내서 value가 홀수인 알파벳 하나를 check에 담고 알파벳 개수의 절반을 answer_list에 담아준다. palindrome은 가운데를 기준으로 글자수가 똑같기 때문이다. 만약, check가 True라면 홀수개의 알파벳이 여러 개라는 뜻이므로 I'm Sorry Hansoo를 리턴한다. 짝수 개의 알파벳 또한 개수의 절반만 answer_list에 담는다.

 

사전순으로 앞서는 것을 출력하므로 answer_list를 정렬하고 answer_list를 join한 문자열 + check 문자열 (check가 없을 경우는 그냥 '' 이므로 답에 영향을 끼치지 않는다.) + answer_list를 뒤집은뒤 join한 문자열을 return 해주면 된다.

def palindrome():
    check = ''
    answer_list = []
    for k, v in munza.items():
        if v % 2:
            if check:
                return 'I\'m Sorry Hansoo'
            check = k
            for _ in range(v//2):
                answer_list.append(k)
        else:
            for _ in range(v//2):
                answer_list.append(k)
    answer_list.sort()
    return ''.join(answer_list) + check + ''.join(answer_list[::-1])


munza = {}

for char in input():
    if char in munza.keys():
        munza[char] += 1
    else:
        munza[char] = 1

print(palindrome())

'알고리즘' 카테고리의 다른 글

[SWEA] 2105. 디저트 카페  (0) 2021.10.12
[백준] 21610. 마법사 상어와 비바라기  (0) 2021.10.11
[백준] 16235. 나무 재테크  (0) 2021.10.07
[백준] 21609. 상어 중학교  (0) 2021.10.05
[백준] 21608. 상어 초등학교  (0) 2021.10.05