1213-法林dromの作成
13265 ワード
初めから1首の名を得た.
この順番をよく混ぜてパリンドロンを作る必要があるという問題です.
名前を交換したいのですが、これは非常に効果的な方法です.
タイムアウトしました.(DFSで解決済み)
どうせ私たちは1つの名前に含まれているアルファベットを利用してファリンドロンを作成する必要があります.
名前の各アルファベットに何個含まれているかを格納する2 Dリスト.
(後に別のコミュニケーションでASCIIを用いたコードを見た:
1つの名前に用いるアルファベットの種類を求める必要があるため、重複を除く
これは、後に使用する2次元
すなわち、アルファベットタイプ
indexは
注意しなければならないのは、事前の順序で高速のファリン症候群を出力することです.
偶数文字は個数/2を表す.
単数のアルファベットは、中心に1つだけ保持され、個数/2が配置されます.
エンディングはPalindromeなので、フロントエンド+センター+フロントエンド(reverse=True)として出力されます.
ちなみにアルファベット数に2つ以上の単数文字があると、パリンドロンは作成できません.
My Code
CounterObjectはdict()によく似ています
.items(), .keys(), .values()、list(counter.items()).
この順番をよく混ぜてパリンドロンを作る必要があるという問題です.
名前を交換したいのですが、これは非常に効果的な方法です.
タイムアウトしました.(DFSで解決済み)
どうせ私たちは1つの名前に含まれているアルファベットを利用してファリンドロンを作成する必要があります.
名前の各アルファベットに何個含まれているかを格納する2 Dリスト.
(後に別のコミュニケーションでASCIIを用いたコードを見た:
ord(A)
=65)1つの名前に用いるアルファベットの種類を求める必要があるため、重複を除く
set()
を用いてアルファベットをフィルタリングし、set
をlist
に再変更した.これは、後に使用する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])
Reference
この問題について(1213-法林dromの作成), 我々は、より多くの情報をここで見つけました https://velog.io/@seilk/1213-팰린드롬-만들기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol