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

SeungHyun·2023년 9월 25일

coding test

목록 보기
7/16

0. 기본 정보

0-A. 개요

python/백준 - 1213번 문제에 대한 분석임.

0-B. 문제 정보

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


1. 정답 코드

from collections import Counter

def palindrome(word):
    answer = ""
    word = Counter(word)
    word_set = list(word.keys())
    word_set.sort()
    word_odd = [w for w in word_set if word[w]%2!=0]

    for w in word_set:
        answer += w*(word[w]//2)

    if word_odd:
        answer = answer + word_odd[0] + answer[::-1]
    else:
        answer = answer + answer[::-1]

    return str(''.join(answer))


n = input()
counter_n = Counter(n)
check_odd = [1 if i%2!=0 else 0 for i in counter_n.values()]
if (len(n)%2==0 and sum(check_odd)==0) or\
    (len(n)%2!=0 and sum(check_odd)==1):
    print(palindrome(n))

else:
    print("I'm Sorry Hansoo")

2. 핵심풀이

  1. 팰린드롬 문자열로 만들 수 있는 문자열인지?
  2. 만들 수 있다면 어떻게 만들어야하는지 ?
    • 문자열 길이가 짝수인 경우(좌우 대칭)
    • 문자열 길이가 홀수인 경우(홀수개인 문자열을 가운데에 놓고 나머지는 좌우대칭)

2-a. 코드 분석

from collections import Counter
  • collections.Counter 를 import 해준다.
  • 편리하고 빠르게 개수를 세도록 지원하는 객체 (ref. python공식문서)

def palindrome(word):
    answer = ""
    word = Counter(word)
    word_set = list(word.keys())
    word_set.sort()
    word_odd = [w for w in word_set if word[w]%2!=0]

    for w in word_set:
        answer += w*(word[w]//2)

    if word_odd:
        answer = answer + word_odd[0] + answer[::-1]
    else:
        answer = answer + answer[::-1]

    return str(''.join(answer))
  • 팰린드롬 문자열로 변환하여 반환해주는 함수
    (반드시 팰린드롬 문자열로 만들 수 있는 경우에만 해당 함수가 호출됨.)

  • word = Counter(word): Counter 객체 생성

  • word_set = list(word.keys()): Coutner 객체의 고유 원소를 list type으로 변경하여 할당

  • word_set.sort(): 출력이 사전순이기 때문에 오름차순 정렬

  • word_odd = [w for w in word_set if word[w]%2!=0]: 만약 문자열이 길이가 홀수인 경우 원소의 갯수가 홀수개의 문자열이 존재하므로 해당 문자열을 찾아서 list에 저장함.
    • Counter 객채는 대괄호 사이에 Counter객체 원소를 넣을시 해당 원소의 갯수를 출력함.
    • ex) temp = ['a', 'a', 'b']이고 temp가 Counter 객체일때 temp['a']는 a의 갯수인 2를 출력함.
  • answer += w*(word[w]//2): str객체인 answer에 각 문자를 문자 갯수의 1/2개를 더함.

  • answer = answer + word_odd[0] + answer[::-1]: 만약 word_odd가 빈 list가 아니라면 전체 문자열의 길이는 홀수개란 의미이며 홀수개에 해당하는 문자열 1개는 반드시 중앙에 와야함.

  • answer = answer + answer[::-1]: word_odd가 빈 list라면 좌우 대칭해주면 팰린드롬 문자열이 완성됨.


n = input()
counter_n = Counter(n)
check_odd = [1 if i%2!=0 else 0 for i in counter_n.values()]
if (len(n)%2==0 and sum(check_odd)==0) or\
    (len(n)%2!=0 and sum(check_odd)==1):
    print(palindrome(n))

else:
    print("I'm Sorry Hansoo")
  • check_odd = [1 if i%2!=0 else 0 for i in counter_n.values()]: Counter객체의 values값.
    즉, 객체의 원소의 갯수들만 모은 집합.
    • sum(check_odd) == n: 원소의 갯수 중 홀수개인 원소가 n개
  • (len(n)%2==0 and sum(check_odd)==0): 팰린드롬 문자열로 변형이 가능.
    • len(n)%2==0: 문자열 길이 짝수
    • sum(check_odd)==0: 원소의 갯수가 홀수개인 원소 갯수 0개
  • (len(n)%2!=0 and sum(check_odd)==1): 팰린드롬 문자열로 변형이 가능.
    • len(n)%2==0: 문자열 길이 홀수
    • sum(check_odd)==0: 원소의 갯수가 홀수개인 원소 갯수 1개
    • 만약 원소의 갯수가 홀수개인 원소가 2개 이상이라면 이는 반드시 팰린드롬 문자열로 변형이 불가능
  • print(palindrome(n)): 위 조건을 만족시키면 팰린드롬 문자열로 변형이 가능한 문자열이므로 함수를 호출하여 팰린드롬 문자열을 반환받고 출력함.
profile
어디로 가야하오

0개의 댓글