코딩테스트

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

CuckooBird 2023. 2. 15. 21:42

백준 실버3 1213 팰린드롬 만들기 - Python

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

 

1213번: 팰린드롬 만들기

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

www.acmicpc.net


문제


코드

맞았습니다가 뜬 코드입니다. - 메모리 31388KB  | 시간 44ms | 코드 길이 840B

import sys
input = sys.stdin.readline
word = list(input().rstrip())
word.sort()
dic = dict()
ansR = list()
ansL = list()
for w in word:
    if w not in dic:
        dic[w] = 1
    else:
        dic[w] += 1
cnt = 0
for k in dic.keys():
    if dic[k] % 2 == 1:
        odd = k
        cnt += 1 # 홀수 개인 문자가 2개 이상일 경우에 쏘리
    if cnt >= 2:
        print("I'm Sorry Hansoo")
        exit(0)
m = len(word)
if m % 2 == 0: # 문자열 개수가 짝수개일때
    for k in dic.keys():
        n = dic[k] // 2
        for j in range(n):
            ansL.append(k)
    ansR = list(reversed(ansL))
else: # 문자열 개수가 홀수개일때
    for k in dic.keys():
        n = dic[k] // 2
        for j in range(n):
            ansL.append(k)
    ansR = list(reversed(ansL))
    ansL += odd
print(''.join(ansL+ansR))

정렬을 마친 뒤에 리스트를 왼쪽 오른쪽으로 나눠서 왼쪽 먼저 채운다음, 오른쪽 리스트는 왼쪽을 뒤집었습니다.

만약 홀수일경우에는 odd에 저장해두었던 홀수개 문자를 가져와 ansL에 붙여줍니다.


Try1.

틀렸습니다가 뜬 코드입니다. - 코드 길이 1064B

import sys
input = sys.stdin.readline
word = list(input().rstrip())
word.sort()
print(word)
dic = dict()
ansR = list()
ansL = list()
for w in word:
    if w not in dic:
        dic[w] = 1
    else:
        dic[w] += 1
cnt = 0
for k in dic.keys():
    if dic[k] % 2 == 1:
        cnt += 1 # cnt는 문자의 개수가 홀수인 경우를 셈 (2이상일때 sorry)
n = len(word)
if n % 2 == 0: # 문자열 개수가 짝수개일때
    if cnt >= 1:
        print("I'm Sorry Hansoo")
        exit(0)
    else:
        for k in dic.keys():
            n = dic[k] // 2
            for j in range(n):
                ansL.append(k)
        ansR = list(reversed(ansL))
        ansL.pop()
else: # 문자열 개수가 홀수개일때
    if cnt > 1:
        print("I'm Sorry Hansoo")
        exit(0)
    else:
        for k in dic.keys():
            if dic[k] % 2 == 1:
                ansL.append(k)
            n = dic[k] // 2
            for j in range(n):
                ansL.append(k)
        ansR = list(reversed(ansL))
        ansL.pop()
print(''.join(ansL+ansR))
  • 왜 틀렸는지는 아직 모르겠지만, 중복되는 케이스가 좀 있는 코드입니다.

후기

전에 이 문제를 과제로 내려고 했었는데..

딱 봐도 제가 싫어하는 문자열이 있길래 패스했었습니다..

 

그런데..

 

김방구뽕뽕이가.. 내버서.. 어쩔수없이.. 해버렸습니다..

덕분에 뇌 주름이 한 줄 더 생겼습니다... 👍