chyam

[백준] 1213번, python - 팰린드롬 만들기 본문

백준

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

chyam_eun 2025. 7. 30. 19:29

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

처음 풀이는 아래와 같다. 

name = input() # 이름
alpha,num = [],[] # 알파벳 저장, 개수 저장
new = ['0'] * len(name) # 새로운 리스트를 만들어서 '0'으로 초기화하기. 
idx = 0 # 인덱스 번호 
odd = 0 # 홀수 개수 

# 각 알파벳을 alpha에 저장. 중복 X
for i in name:
    if i in alpha: # 있으면 개수 증가
        num[alpha.index(i)] += 1 
    else: # 없으면 알파벳 추가 후 개수 추가 
        alpha.append(i)
        num.append(1)

for i in range(len(alpha)-1): # 내림차순으로 하기. num도 함께 바꿔줘야함 
    for j in range(i+1, len(alpha)):
        if alpha[i] > alpha[j]:
            alpha[i], alpha[j] = alpha[j], alpha[i]
            num[i], num[j] = num[j], num[i]

for i in num: # 홀수인것 개수 세기 
    if i%2==1:
        odd+=1 

if odd > 1: # 홀수개인게 2개이상이면 안됨 
    print("I'm Sorry Hansoo")
else:
    for i in range(len(alpha)):
        while num[i] > 0: # 갯수 
            if num[i] == 1: # 1개이면 가운데에 넣기 
                new[len(name)//2] = alpha[i]
                num[i] -= 1
            else:
                new[idx] = alpha[i] # 앞부분
                new[-idx-1] = alpha[i] # 뒷부분
                num[i] -= 2
                idx += 1
    print(''.join(new))

 

지피티한테 간단하게 해달라고 한 풀이는 아래와같다. 

from collections import Counter

name = input()
counter = Counter(name.upper())
center = '' 
half = []

for ch in sorted(counter):
    cnt = counter[ch]
    if cnt % 2 == 1:
        if center:  # 이미 홀수인 문자가 하나 있음
            print("I'm Sorry Hansoo")
            break
        center = ch
    half.append(ch * (cnt // 2)) # 반만 넣음 
else:
    left = ''.join(half) 
    right = left[::-1] # 뒤집힌 문자열
    print(left + center + right) # 원래 문자열 + 가운데 + 뒤집힌 문자열