본문 바로가기

Algorithm/Baekjoon BOJ

[백준][파이썬] 1213번 : 팰린드롬 만들기(코드, 해설, 풀이)

반응형

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

 

1213번: 팰린드롬 만들기

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

www.acmicpc.net

 

 

 


- 문제

  팰린드롬이란 절반을 나눴을 때 좌측이랑 우측이랑 완전히 똑같은 것을 말한다. AAABB의 경우에 ABABA 혹은 BAAAB 등으로 팰린드롬을 만들 수 있는데, ABABA가 사전상 먼저 나타나므로 ABABA가 출력된다. 


- 해설

 

  문자열을 알파벳으로 분리하여 각각의 알파벳이 몇 번씩 등장하는지 세어보면 두 가지의 경우로 나타날 것이다.

 

1. 등장 횟수가 홀수번인 알파벳이 2개 이상이다.

: 홀수번 등장하는 알파벳이 2개 이상이면 어떻게 만들어도 팰린드롬이 만들어지지 않으므로 I'm sorry hansoo를 출력한다. 

ex) ABAA, ABCC 등

 

 

2. 등장 횟수가 홀수번인 알파벳이 1개 이하이다.

: 짝수번 등장한 알파벳의 경우 2로 나누어 중심에서 좌측과 우측으로 분배될 수 있도록 한 후 출력하고, 중심에 들어가야 할 홀수번 등장한 알파벳은 따로 추가해주거나 홀수번 등장한 알파벳이 없으면 무시한다.

 

 


- 풀이

import sys
word = sys.stdin.readline().strip()     # 받는 문자열
alphas = [0 for _ in range(27)]         # 알파벳 개수
odds = 0                                # 홀수 개수
oddIndex = -1                           # 홀수의 위치
for letters in word:
    alphas[ord(letters)-65] += 1
for i in range(len(alphas)):
    if alphas[i] % 2 == 1:              
        odds += 1
        oddIndex = i    
        if odds == 2:                   # 홀수가 2개 이상이면
            print("I'm Sorry Hansoo")
            exit()
alphas[oddIndex] -= 1                   # 홀수의 알파벳 하나 미리 빼놓기
for i in range(len(alphas)):            # 팰린드롬의 좌측 출력
    if alphas[i] % 2 != 1:
        for _ in range(alphas[i]//2):
            print(chr(i+65), end="")
if oddIndex != -1:
    print(chr(oddIndex+65), end="")     # 미리 빼놓은 알파벳 하나 출력
for i in range(len(alphas)-1, -1, -1):  # 팰린드롬의 우측 출력
    if alphas[i] % 2 != 1:
        for _ in range(alphas[i]//2):
            print(chr(i+65), end="")

   알파벳을 좌측과 우측으로 나누어서 출력하는 방법은 간단하다. 반복문을 0부터 26까지 진행하는거 하나랑, 26부터 0까지 진행하는 반복문을 만들어서 진행하면 첫 번째가 중심의 좌측 부분, 두 번째가 중심에서 우측 부분을 만든다. 이 둘의 중간에 알파벳을 넣어야 하면, 그냥 추가해주면 된다.

반응형