1213-法林dromの作成

13265 ワード

初めから1首の名を得た.
この順番をよく混ぜてパリンドロンを作る必要があるという問題です.
名前を交換したいのですが、これは非常に効果的な方法です.
タイムアウトしました.(DFSで解決済み)
どうせ私たちは1つの名前に含まれているアルファベットを利用してファリンドロンを作成する必要があります.
名前の各アルファベットに何個含まれているかを格納する2 Dリスト.
(後に別のコミュニケーションでASCIIを用いたコードを見た:ord(A)=65)
1つの名前に用いるアルファベットの種類を求める必要があるため、重複を除くset()を用いてアルファベットをフィルタリングし、setlistに再変更した.
これは、後に使用する2次元listにおいて、indexを重複を除くアルファベットlistのindexに対応させるためである.
すなわち、アルファベットタイプlistのindexを直接使用して、使用するアルファベットの個数を格納するために2次元listを作成することができる.
indexはlist.index(values)を使用してロードされます.
注意しなければならないのは、事前の順序で高速のファリン症候群を出力することです.
偶数文字は個数/2を表す.
単数のアルファベットは、中心に1つだけ保持され、個数/2が配置されます.sort()をアルファベット順に並べてPalindromeを作成することで、辞書順が解決されます.
エンディングはPalindromeなので、フロントエンド+センター+フロントエンド(reverse=True)として出力されます.
ちなみにアルファベット数に2つ以上の単数文字があると、パリンドロンは作成できません.
My Code
import sys
nameHansoo = list(str(sys.stdin.readline().rstrip())); nameHansoo.sort()
spell_nameHansoo = list(set(nameHansoo)); spell_nameHansoo.sort() #중복 없는 리스트, Hansoo 이름에 포함된 알파벳으로 구성
# print(spell_nameHansoo)
save = [[0, 0] for i in range(len(spell_nameHansoo))]
for i in spell_nameHansoo:
    save[spell_nameHansoo.index(i)][0] = i #set에서 i의 위치가 2차리스트의 row가 된다.
    save[spell_nameHansoo.index(i)][1] = nameHansoo.count(i) #<<list>>.count("items")
save.sort() # [알파벳, 이름에 등장하는 횟수] 로 이뤄진 2차원 리스트 생성, 알파벳이 각 행의 첫번째 원소이므로 알파벳순으로 정렬
# print(save)
fault = 0 #홀수개인 알파벳의 개수 초기화
answer = "" #정답 초기화
center = "" #가운데 위치해야하는 알파벳 초기화
for i in range(len(save)): #i는 ABCD순으로 들어감 why? save.sort
    if save[i][1] % 2 == 1: #홀수인 경우
        fault += 1
        center = save[i][0] #홀수 덩어리가 무조건 가운데에 오게 되면 사전순을 위배함, 홀수값 자체를 저장
        if fault >= 2: #홀수개인 알파벳이 2개 이상이면 sorry hansoo 출력
            print("I\'m Sorry Hansoo", end = "")
            sys.exit(0)
    answer += save[i][0] * int(save[i][1] // 2) #홀수, 짝수 관계없이 알파벳에 몫만큼 곱해서 answer에 더해줌. (갱신) AA - > A         A

#알파벳 순으로 for loop을 돌기 때문에 가급적이면 들어오는 알파벳이 중간중간에 끼어있어야 답이 나온다.(사전순으로 첫번째 Palindrome)
#ZZZ가 있다고 하면 Z는 어차피 save의 마지막 원소가 되므로 답은 "...ZZZ..."가 된다. # AABBCC...VVXXZZZXXVV,,,CCBBAA
answer = answer + center + "".join(list(reversed(answer)))
print(answer)

#AAABB -> ABABA but BAAAB
++Counterここで初めて勉強します.from collections import Counter Counterは、リスト内の各要素を並べ替え、CounterObjectに戻る.
CounterObjectはdict()によく似ています
.items(), .keys(), .values()、list(counter.items()).
collections.Counter -> {items : # of items}

# 팰린드롬 만들기
import sys
import collections

inpuT = sorted(sys.stdin.readline().rstrip())
dicT = collections.Counter(inpuT)

odd = list(filter(lambda x:x[1]%2 == 1, dicT.items()))
middle = ''

if len(odd) > 1:
  print("I'm Sorry Hansoo")
  sys.exit(0)
elif len(odd) == 1:
  middle = odd[0][0]

result = ''
for key, val in dicT.items():
    result += key*(val//2)

print(result + middle + result[::-1])