白駿9020-金バッハの推測
白骏9020-金巴赫的推测
少数の関連問題
解法
小数点以下のリストを作成します.
入力値の半分に最も近い小数または等しい小数(a)を検索し、小数リストでaのインデックス値を検索します.
aを加えて、入力値として別の小数(b)を探します.
条件を満たすbがない場合、インデックスがaより小さい小数を検索します.
条件を満たすa,bが見つかるまで3−4を繰り返す.
コード#コード#
#에라토스테네스의 체를 만들기 위한 리스트 생성
tlst = [False, False] + [True]*(10000-1)
#소수를 저장할 리스트 생성
plst = []
for i in range(2, int(101)):
#101은 10000에 루트를 씌운 값(100) + 1 (range함수는 이하부터 미만이므로 +1을 해줘야함)
if tlst[i] == True:
j = 2
while i*j <= 10000:
tlst[i*j] = False
j += 1
#소수 i의 배수들을 False로 초기화
for i in range(len(tlst)):
if tlst[i] == True:
plst.append(i)
#소수를 plst에 저장
def Gold_vach(num):
idx = max([i for i in range(len(plst)) if plst[i] <= num//2])
#plst중 num/2에 가장 가까우면서 작거나 같은 수의 인덱스를 idx에 초기화
for i in range(idx, -1, -1):
#idx에서 출발해서 점점 작아지다가 0까지 조회
for j in range(i, len(plst)-1):
#idx에서 출발해서 점점 커지다가 최대값까지 조회
if plst[i] + plst[j] == num:
return plst[i], plst[j]
elif plst[i] + plst[j] > num:
break
#합이 num보다 커지면 빠르게 반환
T = int(input())
for case in range(T):
N = int(input())
a, b = Gold_vach(N)
print(a,b)
考慮すべき問題
最初に問題を解くと、テスト例ごとに小数リスト(plst)が再生成され、時間がかかります.
その後最初から小数リストを作成し,試験用例ごとに小数リストを用い,確認速度が7倍程度増加した.
短い時間の人の解答を見て、小数を格納するリスト(plst)を別途生成するのではなく、予め生成したリスト(tlst)を用いて解答することを確認します.この方法を用いると,tlst真値を持つインデックスを数で解くことができる.しかし、今の実力で表現するには時間がかかるかもしれないので、勉強が進歩してから見ることにしました.
Reference
この問題について(白駿9020-金バッハの推測), 我々は、より多くの情報をここで見つけました https://velog.io/@tyvod30/백준-9020-골드바흐의-추측テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol