TIL#13.3.14標準問題



白駿問題1316号-組合せ語Checker
質問する
コンビネーションワードとは、単語に存在するすべての文字に対して、各文字が連続して現れる場合にのみ使用されます.例えば、ccazzzbbは、c、a、z、bが連続して現れるため、kinもk、i、nが連続して現れるが、aabbbbcbはbが落ちたため、組合せ語ではない.
プログラムを作成し、N個の単語を入力し、グループ内の単語数を出力してください.
入力
1行目の単語の個数はNです.Nは100以下の自然数である.2行目から、単語はN行に入ります.単語はアルファベット小文字だけで、繰り返しず、最長100です.
しゅつりょく
最初の行はグループ語の個数を出力します.
に答える
#그룹단어 체커 -백준문제 (복습)
import sys
word_number = int(sys.stdin.readline())    
words_ = [sys.stdin.readline().lower() for _ in range(word_number)] #입력할 단어들을 list 형태로 받아내는 구조
count = 0

for word in words_: #리스트안에서 각 단어들 호출
    test_result = 0 #리스트의 단어가 바뀔때마다 test_result를 초기화
    for j in range(len(word)): 
        if word.find(word[j], j+1) - j > 1: #단어 알파벳들중 같은 알파벳을 찾는 방법. find()함수를 이용해서 찾아낸다. 해당 알파벳을 다음 위치부터 돌면서 같은 알파벳끼리의 거리가 1이상이면 return false
            test_result = -1
            break

        else:
            test_result =1 #모든 원소를 돌고 거리가 1이상인 알파벳 인덱스가 없을 경우 test_result = 1 반환 
    
    if test_result == 1:
        count += 1

    else:
        continue

print(count)
白駿問題2839号-砂糖配送
質問する
尚根は最近砂糖工場で砂糖を送った.尚根は今、キャンディ屋に正確にNキロの砂糖を送る.砂糖工場で生産された砂糖は袋に入っている.袋は3キロ袋と5キロ袋があります.
尚根は面倒なので、できるだけ少ない袋を持っていきたいと思っています.例えば、18キロの砂糖を配達する必要がある場合は、3キロの袋を6つ持ってもいいですが、5キロと3キロを3つ配達すれば、より少ない数の袋を配達することができます.
尚根がNキロの砂糖を正確に配達する必要がある場合は、いくつかの袋を持っていくことができるかどうかを確認するプログラムを作成してください.
入力
1行目はNです.(3 ≤ N ≤ 5000)
しゅつりょく
上から渡された袋の最低個数を出力します.もし、N kgを正確に作れなかったら、-1を出力します.
プール:
import sys
N = int(sys.stdin.readline())

if N % 5 == 0:     #5로 나누어진다면 바로 5로 나누어진 몫이 정답이다.
    print(N//5)

else:
    threekg_bag = 1  #처음에 3kg짜리 가방을 1개로 대입하고 시작한다
    min_list = []  #최소한의 갯수를 구하기위해서 쓰일 리스트

    while N>=3:  #무조건 3이상인경우면 가능 3키로이상부터 3kg 가방에 넣을 수 있다.
        N -=3
        if N % 5 == 0:  #3을 처음에 빼고 5로 나누어지면 3kg짜리 가방갯수 + N을 5로나눈 몫을 더한고 list에 append
            min_list.append(threekg_bag + N//5)
        else:
            threekg_bag +=1

    if len(min_list) == 0: #min_list에 아무것도 없으면 나누어지지 않는 숫자이기에 -1반환
        print(-1)

    else:
        print(min(min_list))
100題1011-Fly me to the Centuri
質問する
ウヒョンは小さい頃、地球以外の他の惑星でも人類が生き残ることができると信じていた.そして、彼が地球という世界に足を踏み入れてから23年後の今日、世界で最も若いASNA宇宙飛行士となり、新しい世界に足を踏み入れる光栄な時を待っています.
彼が乗る宇宙船には、アルファCentauriという新しい人類の家を切り開くための大規模な生活維持システムが搭載されているため、その巨大なサイズと品質を理由に、最新技術の力を総合的に運用して開発された宇宙移動装置が搭載されている.しかし、このような空間移動装置の欠点は、移動距離が急激に増加すると、機械に深刻な欠陥が生じ、従来の作業時期にk光年を移動する際にk−1、kまたはk+1光年で再移動できることである.例えば、この装置を初めて起動すると、理論的には−1,0,1光年移動できるが、実際には負またはゼロ距離移動は意味がないので、1光年移動し、その後0,1,2光年移動することができる.△ここでさらに2光年移動すれば、次の時期に1、2、3光年移動できる.
金氏は、空間移動装置の起動時のエネルギー消費が大きいことをよく知っているので、x点からy点への移動が最も少ない起動回数を考えている.しかしながら、y点に到達しても、空間移動装置の安全性を確保するためには、y点に到達するまでの移動距離は1光年でなければならない.
キム・ウヒョンのために、x点からy点に正確に移動するために必要な空間移動装置の操作回数の最高値を作成してください.
入力
入力された第1行は、試験例の個数Tを与える.各テストケースについて、現在の位置xとターゲット位置yは整数であり、xは常にyより小さい.(0 ≤ x < y < 231)
しゅつりょく
各テストキャビネットについて、x点からy点まで正確に到達するために必要な最小空間移動装置の操作回数を出力する.
に答える

import math
import sys
N = int(sys.stdin.readline())

for _ in range(N):
    x, y = map(int, sys.stdin.readline().split())
    distance = y -x    # 두 거리를 계산할 때 필요하다.
    count = 0 

    #해당문제는 거리의 제곱근 기준으로 최소 이동 횟수를 잡을 수 있다.
    trial_number = math.floor(math.sqrt(distance))  #거리의 제곱근을 구한다. 10이면 3과 4이인데 floor를 사용하여 3으로 반환
    trial_number_square = trial_number ** 2 #trial_number의 제곱수를 반환
    trial_plus_one = math.sqrt(trial_number_square) # 이동횟수를 +1해줄 최소 distance 움직임 수

    #거리에 따라서 나눈 구조
    if distance > trial_number_square + trial_plus_one:
        count = 2 * trial_number + 1
    elif distance > trial_number and distance <= trial_number_square + trial_plus_one:
        count = 2 * trial_number
    elif distance == trial_number_square:
        count = (2 * trial_number) -1
    elif distance < 4:
        count = distance

print(count)
質問する
任意の自然数nは、nより大きく、2 n以下の数が少なくとも1つ存在することを示す.
この命題はジョセフ・バートランが1845年に推測したもので、パフヌティ・チェビショフは1850年に証明した.
たとえば、10以上、20以下の小数が4つあります.(11、13、17、19)また、14より大きく28以下の小数が3個ある.(17,19, 23)
自然数nが与えられた場合、nより大きい、2 n以下の数を求めるプログラムを作成します.
入力
入力は、複数のテスト・インスタンスから構成されます.各ボックスは、nを含む行からなる.
入力の最後は0です.
しゅつりょく
各試験例について、出力はnより大きく、2 n以下の少数の数である.

import sys

m = int(sys.stdin.readline())
n = 2*m + 1
prime_truth = [True] * n
prime_list = []


for i in range(2, int(n**0.5)+1):
    if prime_truth[i] == True:
        for j in range(2*i,n,i):
            prime_truth[j] == False
    

for i in range(m+1, n):
    if i > 1 and prime_truth[i] == True:
        prime_list.append(i)

print(len(prime_list))
質問する
666は末日を表す数字だそうです.そのため、多くの大きな映画では666のタイトルが使用されています.映画監督郅は世界最後のシリーズ映画の監督である.ジョージ・ルーカスはスターウォーズを制作する際、『スターウォーズ1』『スターウォーズ2』『スターウォーズ3』『スターウォーズ4』『スターウォーズ5』『スターウォーズ6』と同様に命名され、ピーター・ジャクソンは『指輪王』を制作する際、『指輪王1』『指輪王2』『指輪王3』と同様に映画と命名された.
しかし、ジョージ・ルーカスとピーター・ジャクソンを超えたことを証明するために、ジョーは映画の名前を違うものに変えることにした.
末日数字とは、ある数字のうち少なくとも6つが連続して3つ以上の数字であることを意味する.最小の末日数字は666で、次いで1666266663666です.に等しい
そのため、ʤは第1部映画の名前を世界末日666、第2部映画の名前を世界末日1666と命名した.一般的に、N本目の映画のタイトルは世界の終わり(N番目の小さな終わりの数字)に等しい.
プログラムを作成して、N本目の映画タイトルの数字を印刷してください.ʤはいつもこのシリーズを順番に作って、他の映画を作らない.
入力
最初の行には、数字Nが与えられる.Nは10000以下の自然数である.
しゅつりょく
第1行目には、第N本目の映画タイトルの数字が出力される.
import sys

Number = int(sys.stdin.readline())
k, cnt = 666, 0  # 카운트를 셀 변수와 꾸준히 증가해야하는 변수를 하나 지정해서 진행

while True:    
    if '666' in str(k): #'666'이라는 문자열이 k str에 있다면 cnt 하나 증가 - 첫번쨰 666은 첫번째 cnt 2번째 666은 두번째 cnt
        cnt += 1
    
    if cnt == Number: #count랑 입력한값이랑 같아졌을 때 계속 1씩 증가시키던 k값을 프린트하면 정답이 나온다.
        print(k)
        break

    else:
        k +=1