ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 1213번 팰린드롬 만들기
    Algorithm Study/Python 2021. 5. 28. 01:17

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

     

    문제

    임한수와 임문빈은 서로 사랑하는 사이이다.

    임한수는 세상에서 팰린드롬인 문자열을 너무 좋아하기 때문에, 둘의 백일을 기념해서 임문빈은 팰린드롬을 선물해주려고 한다.

    임문빈은 임한수의 영어 이름으로 팰린드롬을 만들려고 하는데, 임한수의 영어 이름의 알파벳 순서를 적절히 바꿔서 팰린드롬을 만들려고 한다.

    임문빈을 도와 임한수의 영어 이름을 팰린드롬으로 바꾸는 프로그램을 작성하시오.

     

    입력

    첫째 줄에 임한수의 영어 이름이 있다. 알파벳 대문자로만 된 최대 50글자이다.

     

    출력

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

     

     

    풀이

    팰린드롬을 만들기 위해서는 각 알파벳이 짝수개만 존재하거나 단 1종류의 알파벳만 홀수개로 있어야한다.
    (A, ABA, ABBBA 와 같이 가운데 오는 알파벳은 홀수일 수 있다)

     

    name = list(map(str, sys.stdin.readline().strip()))
    name_count = [0 for _ in range(26)]
    for i in name:
        name_count[ord(i)-65] += 1
    

    입력받은 이름의 각 알바벳의 갯수를 세아려 name_count 리스트에 담아뒀다.

     

    for i in range(26):
        if name_count[i] % 2 == 1:
            odd += 1
            temp = chr(i+65)
        answer += chr(i+65) * (name_count[i] // 2)

     

    name_count 리스트를 돌면서 홀수인 경우 odd count를 1 올리고 temp에 해당 알파벳을 넣었다.
    (마지막에 팰린드롬을 구성할 때 가운데 넣기 위해서)
    짝수인 경우에는 answer에 갯수의 절반에 해당하는 알파벳을 넣었다.
    (A가 4개가 있다면 2개, 8개가 있다면 4개)

     

    reverse_answer = list(answer)
    reverse_answer.reverse()
    if odd > 1:
        print("I'm Sorry Hansoo")
    else:
        print(answer + temp + ''.join(map(str, reverse_answer)))

    홀수 갯수를 가진 알파벳이 2개 이상인 경우에는 팰린드롬을 구성할 수 없기 때문에
    I'm Sorry Hansoo를 출력하고 아닌 경우에는 answer과 temp answer을 reverse한 값을 출력하였다.

    문자열을 reverse하기 위해서 list로 변환하고 reverse함수를 이용하여 변경하였고 모든 name_count가 짝수인 경우에는 temp에 아무 값도 들어있지 않기 때문에 문제없이 작동한다.

     

    전체 코드

    import sys
    
    name = list(map(str, sys.stdin.readline().strip()))
    answer = ''
    temp = ''
    name_count = [0 for _ in range(26)]
    odd = 0
    for i in name:
        name_count[ord(i)-65] += 1
    
    for i in range(26):
        if name_count[i] % 2 == 1:
            odd += 1
            temp = chr(i+65)
        answer += chr(i+65) * (name_count[i] // 2)
    
    reverse_answer = list(answer)
    reverse_answer.reverse()
    if odd > 1:
        print("I'm Sorry Hansoo")
    else:
        print(answer + temp + ''.join(map(str, reverse_answer)))

    'Algorithm Study > Python' 카테고리의 다른 글

    [백준] 1092번 배  (0) 2021.05.28
    [백준] 1254번 팰린드롬 만들기  (0) 2021.05.28
    [백준] 1158번 요세푸스 문제  (0) 2021.05.26
    [백준] 1181번 단어정렬  (0) 2021.05.25
    [백준] 1026번 보물  (0) 2021.05.24

    댓글

From BlackHair