白駿1422号:数字の神
数字の神
白駿1422号:数字の神
アイデア
aとbの2つの数字の中でどの数字が前にあるべきか考えてみましょう.まず前列の大きい数字が一番前に出なければなりません.問題は、前の2つの同じ数字(232と23212と21)を比較することです.長い数字がa,短い数字がbの場合,比較aではオーバーラップ部分のsubstirngとbを取り除く.繰り返し続けると、どの数字が前にあるかを決めることができます.232と23に現れるべき数字を直接計算します.
232 vs 23
2 vs 23
2 vs 3
23は前にあるはずです.
また、NがKより大きい場合は、最大の数を複数回使用するだけでよい.前の位置は大きな数字を使うようですが、これは錯覚です.もちろん、同じ数字を連続的に使うべきです.
ex) 9, 80 -> 98080(O) 80980(X)
コード#コード#
import sys
from functools import cmp_to_key
input = sys.stdin.readline
K, N = map(int, input().split())
numlist = [input().rstrip() for _ in range(K)]
def compare(a, b):
if a == b:
return 0
if len(a) >= len(b):
for i in range(len(b)):
if a[i] > b[i]:
return -1
elif a[i] < b[i]:
return 1
return compare(a[len(b):], b)
else:
for i in range(len(a)):
if a[i] > b[i]:
return -1
elif a[i] < b[i]:
return 1
return compare(a, b[len(a):])
s_list = sorted(numlist, key=cmp_to_key(compare))
m = ''
for i in s_list:
if len(i) > len(m):
m = i
elif int(i) > int(m):
m = i
cnt = N - K
for i in s_list:
if i == m:
while cnt > 0:
print(i, end='')
cnt -= 1
print(i, end='')
説明:
functoolsという見知らぬライブラリを使用しました.
デフォルトでは、Python 3でソート基準を決定するキーには、パラメータを受信する関数が使用されます.>>> student_tuples = [
... ('john', 'A', 15),
... ('jane', 'B', 12),
... ('dave', 'B', 10),
... ]
>>> sorted(student_tuples, key=lambda student: student[2]) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
このように、keyに書き込まれた関数が返す値に基づいてソートされる.しかしfunctoolsのcmp to keyを用いて旧式比較関数をkey関数に変換することができる.古い比較関数とは何ですか.
関数は2つの要素(a,b)をパラメータとし、関数が負の値を返すとaはbの前に、正の値を返すとbはaの前に並ぶ.JavaでcompareTo overridingをしているような感じ?
Python 2はこの方式を使用していますsorted(mylist, cmp=lambda item1, item2: fitness(item1) - fitness(item2))
Python 3はこの方式を使用しています.from functools import cmp_to_key
sorted(mylist, key=cmp_to_key(lambda item1, item2: fitness(item1) - fitness(item2)))
比較関数で返される値に基づいてソートします.
おしゃべり
比較関数を書くとき、aとbの2つの数字をつなぎ合わせて大きさを比較すると、もっと簡単ではないかと考えました.フナです.
リファレンス
Sort a list of lists with a custom compare function
functools
Reference
この問題について(白駿1422号:数字の神), 我々は、より多くの情報をここで見つけました
https://velog.io/@ks1ksi/백준-1422번-숫자의-신
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
import sys
from functools import cmp_to_key
input = sys.stdin.readline
K, N = map(int, input().split())
numlist = [input().rstrip() for _ in range(K)]
def compare(a, b):
if a == b:
return 0
if len(a) >= len(b):
for i in range(len(b)):
if a[i] > b[i]:
return -1
elif a[i] < b[i]:
return 1
return compare(a[len(b):], b)
else:
for i in range(len(a)):
if a[i] > b[i]:
return -1
elif a[i] < b[i]:
return 1
return compare(a, b[len(a):])
s_list = sorted(numlist, key=cmp_to_key(compare))
m = ''
for i in s_list:
if len(i) > len(m):
m = i
elif int(i) > int(m):
m = i
cnt = N - K
for i in s_list:
if i == m:
while cnt > 0:
print(i, end='')
cnt -= 1
print(i, end='')
>>> student_tuples = [
... ('john', 'A', 15),
... ('jane', 'B', 12),
... ('dave', 'B', 10),
... ]
>>> sorted(student_tuples, key=lambda student: student[2]) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
sorted(mylist, cmp=lambda item1, item2: fitness(item1) - fitness(item2))
from functools import cmp_to_key
sorted(mylist, key=cmp_to_key(lambda item1, item2: fitness(item1) - fitness(item2)))
Reference
この問題について(白駿1422号:数字の神), 我々は、より多くの情報をここで見つけました https://velog.io/@ks1ksi/백준-1422번-숫자의-신テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol