알고리즘/Greedy

(파이썬 python) 백준 1213번 : 팰린드롬 만들기(greedy)

Aytekin 2022. 5. 12. 09:53
728x90

구글링에서 본 것중 가장 직관적이고 쉬운 풀이를 가져왔다.

names = input()
name_cnt = [0 for _ in range(26)]
for name in names:
    name_cnt[ord(name)-65] += 1
    
odd = 0
odd_alpha = ''
alpha = ''
for i in range(26):
    if name_cnt[i] % 2 == 1:
        odd += 1
        odd_alpha += chr(i+65)
    alpha += chr(i+65) * (name_cnt[i] // 2)
        
if odd > 1:
    print("I'm Sorry Hansoo")
else:
    print(alpha+odd_alpha+alpha[::-1])
    
# 참고 : https://alpyrithm.tistory.com/100

 

 

 

 

내가 혼자 풀어보았던 코드다.

알파벳마다 개수를 구한 뒤 딕셔너리에 넣어주는 방법을 생각해서 구현해보았다.

이 방법의 문제는 우선 dict는 for문에서 순서가 고정되어 있지 않다는 것이다.

그래서 Orderdict라는 객체를 불러와서 사용해주었다.

그런데도 틀렸다는 결과만이...;;;

뭐가 문제인지 아직 모르겠다.

from collections import OrderedDict
s = input()

# 알파벳 개수 딕셔너리 만들기.
s_set = set(s)
s_dict = OrderedDict()
for i in s_set:
    s_dict[i] = s.count(i)

flag = 0
odd = ''
for k,v in s_dict.items():
    if v % 2:
        flag += 1
        odd = k
    if flag >= 2:
        break

ans = []
# i) 알파벳 모두 짝수개 일 때
if flag == 0:
    for k,v in s_dict.items():
        ans.append(k*(v//2))
    ans_reverse = sorted(ans,reverse=True)
    ans = ans + ans_reverse
    ans = ''.join(ans)
    print(ans)

# ii) 홀수개 알파벳 하나 나머지 다 짝수
elif flag == 1:
    for k,v in s_dict.items():
        ans.append(k*(v//2))
    ans_reverse = sorted(ans,reverse=True)
    ans = ans + [odd] + ans_reverse
    ans = ''.join(ans)
    print(ans)
# iii) 불가능
else:
    print("I'm Sorry Hansoo")

# 이거 왜 틀린거지?????????????????????????????????????????????
728x90