[λ°±μ€€/python] 1011번 : Fly me to the Alpha Centauri

2021. 3. 16. 23:44

문제

μš°ν˜„μ΄λŠ” μ–΄λ¦° μ‹œμ ˆ, 지ꡬ μ™Έμ˜ λ‹€λ₯Έ ν–‰μ„±μ—μ„œλ„ 인λ₯˜λ“€μ΄ μ‚΄μ•„κ°ˆ 수 μžˆλŠ” λ―Έλž˜κ°€ 였리라 λ―Ώμ—ˆλ‹€. 그리고 κ·Έκ°€ μ§€κ΅¬λΌλŠ” 세상에 λ°œμ„ λ‚΄λ € 놓은 지 23년이 μ§€λ‚œ μ§€κΈˆ, 세계 μ΅œμ—°μ†Œ ASNA 우주 비행사가 λ˜μ–΄ μƒˆλ‘œμš΄ 세계에 λ°œμ„ λ‚΄λ € λ†“λŠ” μ˜κ΄‘μ˜ μˆœκ°„μ„ 기닀리고 μžˆλ‹€.

κ·Έκ°€ νƒ‘μŠΉν•˜κ²Œ 될 μš°μ£Όμ„ μ€ Alpha CentauriλΌλŠ” μƒˆλ‘œμš΄ 인λ₯˜μ˜ 보금자리λ₯Ό κ°œμ²™ν•˜κΈ° μœ„ν•œ λŒ€κ·œλͺ¨ μƒν™œ μœ μ§€ μ‹œμŠ€ν…œμ„ νƒ‘μž¬ν•˜κ³  있기 λ•Œλ¬Έμ—, κ·Έ 크기와 μ§ˆλŸ‰μ΄ μ—„μ²­λ‚œ 이유둜 μ΅œμ‹ κΈ°μˆ λ ₯을 총 λ™μ›ν•˜μ—¬ κ°œλ°œν•œ 곡간이동 μž₯치λ₯Ό νƒ‘μž¬ν•˜μ˜€λ‹€. ν•˜μ§€λ§Œ 이 곡간이동 μž₯μΉ˜λŠ” 이동 거리λ₯Ό κΈ‰κ²©ν•˜κ²Œ 늘릴 경우 기계에 μ‹¬κ°ν•œ 결함이 λ°œμƒν•˜λŠ” 단점이 μžˆμ–΄μ„œ, 이전 μž‘λ™μ‹œκΈ°μ— k광년을 μ΄λ™ν•˜μ˜€μ„ λ•ŒλŠ” k-1 , k ν˜Ήμ€ k+1 κ΄‘λ…„λ§Œμ„ λ‹€μ‹œ 이동할 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, 이 μž₯치λ₯Ό 처음 μž‘λ™μ‹œν‚¬ 경우 -1 , 0 , 1 광년을 이둠상 이동할 수 μžˆμœΌλ‚˜ 사싀상 음수 ν˜Ήμ€ 0 거리만큼의 이동은 μ˜λ―Έκ°€ μ—†μœΌλ―€λ‘œ 1 광년을 이동할 수 있으며, κ·Έ λ‹€μŒμ—λŠ” 0 , 1 , 2 광년을 이동할 수 μžˆλŠ” 것이닀. ( μ—¬κΈ°μ„œ λ‹€μ‹œ 2광년을 μ΄λ™ν•œλ‹€λ©΄ λ‹€μŒ μ‹œκΈ°μ—” 1, 2, 3 광년을 이동할 수 μžˆλ‹€. )

κΉ€μš°ν˜„μ€ 곡간이동 μž₯치 μž‘λ™μ‹œμ˜ μ—λ„ˆμ§€ μ†Œλͺ¨κ°€ ν¬λ‹€λŠ” 점을 잘 μ•Œκ³  있기 λ•Œλ¬Έμ— xμ§€μ μ—μ„œ y지점을 ν–₯ν•΄ μ΅œμ†Œν•œμ˜ μž‘λ™ 횟수둜 μ΄λ™ν•˜λ € ν•œλ‹€. ν•˜μ§€λ§Œ y지점에 λ„μ°©ν•΄μ„œλ„ 곡간 이동μž₯치의 μ•ˆμ „μ„±μ„ μœ„ν•˜μ—¬ y지점에 λ„μ°©ν•˜κΈ° λ°”λ‘œ μ§μ „μ˜ μ΄λ™κ±°λ¦¬λŠ” λ°˜λ“œμ‹œ 1κ΄‘λ…„μœΌλ‘œ ν•˜λ € ν•œλ‹€.

κΉ€μš°ν˜„μ„ μœ„ν•΄ x지점뢀터 μ •ν™•νžˆ yμ§€μ μœΌλ‘œ μ΄λ™ν•˜λŠ”λ° ν•„μš”ν•œ 곡간 이동 μž₯치 μž‘λ™ 횟수의 μ΅œμ†Ÿκ°’을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

 

μž…λ ₯

μž…λ ₯의 첫 μ€„μ—λŠ” ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€μ˜ 개수 Tκ°€ 주어진닀. 각각의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄ ν˜„μž¬ μœ„μΉ˜ x 와 λͺ©ν‘œ μœ„μΉ˜ y κ°€ μ •μˆ˜λ‘œ 주어지며, xλŠ” 항상 y보닀 μž‘μ€ 값을 κ°–λŠ”λ‹€. (0 ≤ x < y < 2³¹)

 

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄ xμ§€μ μœΌλ‘œλΆ€ν„° yμ§€μ κΉŒμ§€ μ •ν™•νžˆ λ„λ‹¬ν•˜λŠ”λ° ν•„μš”ν•œ μ΅œμ†Œν•œμ˜ κ³΅κ°„이동 μž₯치 μž‘λ™ 횟수λ₯Ό 좜λ ₯ν•œλ‹€.

 

μ •λ‹΅

T = int(input())
answer = []
for i in range(T):
    x, y = map(int, input().split())
    i = 1
    while True:
        if y - x <= i*i:
            answer.append(i+i-1)
            break
        if y - x <= i * i + i:
            answer.append(i + i)
            break
        i += 1


for i in answer:
    print(i)

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€ 두 점 μ‚¬μ΄μ˜ 거리λ₯Ό μ΄μš©ν•œλ‹€.

거리가 1μΌλ•ŒλΆ€ν„° μ‹œμž‘ν•˜μ—¬ 각 κ±°λ¦¬λ§ˆλ‹€ λͺ‡ λ²ˆμ„ μ΄λ™ν•΄μ•Όν•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄λ©° κ·œμΉ™μ„ μ°ΎλŠ”λ‹€.

ν•˜λ‚˜μ”© μ‚΄νŽ΄λ³Έ κ²°κ³Ό, (i의 제곱)κ³Ό (i의 제곱 + i)의 κ±°λ¦¬μ—μ„œ μ΄λ™νšŸμˆ˜κ°€ λ³€ν•˜λŠ” 것을 μ•Œ 수 μžˆμ—ˆλ‹€. 

while True:
        if y - x <= i*i:
            answer.append(i+i-1)
            break
        if y - x <= i * i + i:
            answer.append(i + i)
            break
        i += 1

i값을 1μ”© μ¦κ°€μ‹œν‚€λ©΄μ„œ 두가지 경우 쀑 ν•˜λ‚˜μ— ν•΄λ‹Ήν•  λ•Œμ˜ i값을 μ°ΎκΈ°μœ„ν•œ λ°˜λ³΅λ¬Έμ„ κ΅¬ν˜„ν•œλ‹€.

λ§Œμ•½ 두 점 μ‚¬μ΄μ˜ 거리(y-x)κ°€ i의 μ œκ³±λ³΄λ‹€ μž‘κ±°λ‚˜ κ°™λ‹€λ©΄ μ΄λ™νšŸμˆ˜λŠ” i+(i-1)이닀.

λ§Œμ•½ 두 점 μ‚¬μ΄μ˜ 거리(y-x)κ°€ i의 제곱 + 1보닀 μž‘κ±°λ‚˜ κ°™λ‹€λ©΄ μ΄λ™νšŸμˆ˜λŠ” i + i이닀.

 

answer에 각 μΌ€μ΄μŠ€λ§ˆλ‹€ μ΄λ™νšŸμˆ˜λ₯Ό μ €μž₯ν•˜κ³  λͺ¨λ“  μΌ€μ΄μŠ€μ˜ answer을 κ΅¬ν•œ ν›„ ν•˜λ‚˜μ”© 좜λ ₯ν•œλ‹€.

 

728x90

BELATED ARTICLES

more