반응형
https://www.acmicpc.net/problem/1213
- 문제
팰린드롬이란 절반을 나눴을 때 좌측이랑 우측이랑 완전히 똑같은 것을 말한다. 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까지 진행하는 반복문을 만들어서 진행하면 첫 번째가 중심의 좌측 부분, 두 번째가 중심에서 우측 부분을 만든다. 이 둘의 중간에 알파벳을 넣어야 하면, 그냥 추가해주면 된다.
반응형
'Algorithm > Baekjoon BOJ' 카테고리의 다른 글
[백준][파이썬] 1244번 : 스위치 켜고 끄기(코드, 해설, 풀이) (0) | 2022.05.06 |
---|---|
[백준][파이썬] 1541번 : 잃어버린 괄호(코드, 해설, 풀이) (0) | 2022.05.06 |
[백준][파이썬] 1614번 : 영식이의 손가락(코드, 해설, 풀이) (0) | 2022.05.02 |
[백준][파이썬] 2828번 : 사과 담기 게임(코드, 해설, 풀이) (0) | 2022.05.01 |
[백준][파이썬] 1475번 : 방 번호(코드, 해설, 풀이) (0) | 2022.05.01 |