알고리즘(algorithm)

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

rimrimi 2025. 11. 22. 12:47

# 문제 링크

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

 

# 문제

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

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

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

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

 

# 입력

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

 

# 출력

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

 

# 예제

예제입력 예제출력
AABB ABBA
AAABB ABABA
ABACABA AABCBAA
ABCD I'm Sorry Hansoo

 


# 문제 풀이

https://github.com/taerimiiii/Algorithm/tree/main/%EB%B0%B1%EC%A4%80/Silver/1213.%E2%80%85%ED%8C%B0%EB%A6%B0%EB%93%9C%EB%A1%AC%E2%80%85%EB%A7%8C%EB%93%A4%EA%B8%B0

 

Algorithm/백준/Silver/1213. 팰린드롬 만들기 at main · taerimiiii/Algorithm

This is an auto push repository for Baekjoon Online Judge created with [BaekjoonHub](https://github.com/BaekjoonHub/BaekjoonHub). - taerimiiii/Algorithm

github.com

 

문제를 보고 이걸 어떻게 풀어야 잘 풀었다는 소리가 나오지? 고민했다. 하지만 이런 고민은 사치일 뿐. 그냥 무식하게 짝수일 때와 홀수일 때로 케이스를 분류해 코딩했다^^

 

맞은코드

import sys
input = sys.stdin.readline

# 입력
name = input().strip()

# 변수 선언
length = len(name)
arr = sorted([name[i] for i in range(length)])  # 정렬
answer = [''] * (length // 2)
success = True

# 짝수 일때
if length % 2 == 0 :
    for i in range(length // 2) :
        if arr[i*2] != arr[i*2+1] : # 인덱싱
            success = False
            break
        answer[i] = arr[i*2]    # 정답 갱신

    # 출력 처리
    if success :
        for i in range(length // 2) :
            print(answer[i], end='')
        for i in range(length // 2 - 1, -1, -1) :
            print(answer[i], end='')
    else :
        print("I\'m Sorry Hansoo")

# 홀수 일때
else :
    idx = 0     # 정답을 담는 배열의 인덱스
    odd_cnt = 0 # 짝이 없는 수가 나온 횟수

    for i in range(length//2+1) :
        # 남은 원소가 하나이거나 짝이 맞는 수가 없을 경우
        if len(arr) == 1 or arr[0] != arr[1] :
            if odd_cnt != 0 :   # 짝이 없는 수가 나온 횟수가 1번을 초과하면
                success = False # 실패
                break
            odd_cnt += 1
            odd = arr[0]
            arr.pop(0)

        # 짝이 있는 경우
        else :
            answer[idx] = arr[0]    # 정답 갱신
            idx += 1                # 인덱스 갱신
            arr.pop(0)              # 짝이 있는 수 이므로,
            arr.pop(0)              # 두 번 삭제

    # 출력 처리
    if success :
        for i in range(length // 2) :
            print(answer[i], end='')
        print(odd, end='')
        for i in range(length // 2 - 1, -1, -1) :
            print(answer[i], end='')
    else :
        print("I\'m Sorry Hansoo")