Algorithm Problem/Python

[python] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - 숫자 블둝

deo2kim 2020. 9. 15. 08:23
λ°˜μ‘ν˜•

πŸ€”λ¬Έμ œ ν•΄κ²°

Lv4

 

ꡬ간(begin ~ end)이 μ •ν•΄μ Έ μžˆμœΌλ―€λ‘œ μ „λΆ€λ₯Ό ꡬ할 ν•„μš”λŠ” μ—†λ‹€.

μ„ νƒν•œ κ΅¬κ°„λ§Œ μž˜λΌμ„œ 여기에 μ–΄λ–€ μˆ«μžκ°€ λ“€μ–΄κ°€μ•Ό ν• μ§€λ₯Ό μ•Œμ•„λ³΄μž.

 

κ·œμΉ™μ„ 잘 μ‚΄νŽ΄λ³΄λ©΄

I 의 μ•½μˆ˜ 쀑( 1 μ œμ™Έ) κ°€μž₯ μž‘μ€ 수둜 λ‚˜λˆˆ λͺ«μ΄ ν•΄λ‹Ή 인덱슀의 값이 λœλ‹€.

  • 10을 보면 2,5,10 쀑 2둜 λ‚˜λˆ„λ©΄ 값은 5이닀.
  • 9의 경우 3,9 쀑 3으둜 λ‚˜λˆ„λ©΄ 값은 3이닀.
  • 7의 경우 μ†Œμˆ˜μ΄λ―€λ‘œ 7둜 λ‚˜λˆ„λ©΄ 값은 1이닀.

 

μœ„μ˜ λ°©λ²•μœΌλ‘œ μ½”λ“œλ₯Ό 짜면 정확도 ν…ŒμŠ€νŠΈλŠ” μ•„μ£Ό μ‰½κ²Œ ν†΅κ³Όν•œλ‹€.

 

πŸ’‘μ€‘μš”

이제 νš¨μœ¨μ„± ν…ŒμŠ€νŠΈκ°€ 문제인데 μ‹œκ°„μ΄ˆκ³Όλ„ μ•„λ‹ˆκ³  μ‹€νŒ¨ 라고 ν•œλ‹€.μ΄μœ λŠ” 전체 λ„λ‘œμ˜ κΈΈμ΄λŠ” 10^9 μ΄μ§€λ§Œ λΈ”λ‘μ˜ μˆ«μžλŠ” 10^7 κΉŒμ§€μ΄λ‹€.λͺ«μ΄ 10^7을 λ„˜μ–΄κ°€κ²Œ λœλ‹€λ©΄ 사싀상 해당블둝은 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€!!κ·ΈλŸ¬λ―€λ‘œ λͺ«μ΄ 10^7을 λ„˜μ–΄κ°€λŠ” μˆ«μžλŠ” μŠ€ν‚΅ν•˜κ³  κ·Έ 보닀 큰 숫자둜 λ‚˜λˆ μ„œ 10^7보닀 μž‘μ€ λͺ«μ„ ꡬ해야 ν•œλ‹€.

 

πŸ’»μ†ŒμŠ€ μ½”λ“œ

import math


def solution(begin, end):
    answer = []

    for i in range(begin, end + 1):
        if i == 1:  # i == 1인 κ²½μš°λŠ” λ¬Έμ œμ—μ„œλŠ” 0으둜 주어짐
            answer.append(0)
        else:
            # μ†Œμˆ˜μΈμ§€ μ•„λ‹Œμ§€ νŒλ³„ν•˜κΈ° μœ„ν•΄
            # νŒλ³„ν•˜κΈ° μœ„ν•œ 숫자 i 의 제곱근 κΉŒμ§€ ν•˜λ‚˜μ”© λ‚˜λˆ λ³΄κ³ 
            # μ†Œμˆ˜κ°€ μ•„λ‹ˆλ©΄ λͺ«μ„, μ†Œμˆ˜μ΄λ©΄ 1을 λ„£λŠ”λ‹€.
            sqrt = int(math.sqrt(i))
            for j in range(2, sqrt + 1):
                mok = i // j
                # !!!!μ€‘μš”!!!! - μ •ν™•μ„±μ—μ„œλŠ” ν†΅κ³Όν•˜λ‚˜ νš¨μœ¨μ„±μ—μ„œ ν†΅κ³Όν•˜μ§€ λͺ»ν•˜λŠ” μ΄μœ κ°€ 있음
                # 전체 κΈΈμ΄λŠ” 10**9μ΄μ§€λ§Œ 블둝은 10**7 이닀
                # κ·ΈλŸ¬λ―€λ‘œ λͺ«μ΄ 10**7을 λ„˜μ–΄κ°€λ©΄ μ•ˆλ¨!!
                if mok > 10 ** 7:
                    continue
                if i % j == 0:
                    answer.append(mok)
                    break
            else:
                answer.append(1)

    return answer

 

πŸ“•λ¬Έμ œ 확인

좜처: ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

링크: https://programmers.co.kr/learn/courses/30/lessons/12923

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - 숫자 블둝

1 10 [0, 1, 1, 2, 1, 3, 1, 4, 3, 5]

programmers.co.kr


문제 μ„€λͺ…

κ·Έλ ™μ‹œμ—λŠ” 0으둜 된 λ„λ‘œμ— 숫자 블둝을 μ„€μΉ˜ν•˜κΈ°λ‘œ ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 숫자 λΈ”λ‘μ˜ κ·œμΉ™μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

λΈ”λ‘μ˜ λ²ˆν˜Έκ°€ n 일 λ•Œ, κ°€μž₯ 처음 블둝은 n * 2번째 μœ„μΉ˜μ— μ„€μΉ˜ν•©λ‹ˆλ‹€. κ·Έλ‹€μŒμ€ n * 3, κ·Έλ‹€μŒμ€ n * 4, ...둜 μ§„ν–‰ν•©λ‹ˆλ‹€.λ§Œμ•½ 기쑴에 블둝이 κΉ”λ €μžˆλŠ” 자리라면 κ·Έ 블둝을빼고 μƒˆλ‘œμš΄ λΈ”λ‘μœΌλ‘œ μ§‘μ–΄λ„£μŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ 1번 블둝은 2,3,4,5, ... 인 μœ„μΉ˜μ— μš°μ„  μ„€μΉ˜ν•©λ‹ˆλ‹€. κ·Έλ‹€μŒ 2번 블둝은 4,6,8,10, ... 인 μœ„μΉ˜μ— μ„€μΉ˜ν•˜κ³ , 3번 블둝은 6,9,12... 인 μœ„μΉ˜μ— μ„€μΉ˜ν•©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ 3번 λΈ”λ‘κΉŒμ§€ μ„€μΉ˜ν•˜κ³  λ‚˜λ©΄ 첫 10개의 블둝은 0, 1, 1, 2, 1, 3, 1, 2, 3, 2μ΄λ©λ‹ˆλ‹€.

κ·Έλ ™μ‹œλŠ” 길이가 1,000,000,000인 λ„λ‘œμ— 1번 블둝뢀터 μ‹œμž‘ν•˜μ—¬ 10,000,000번 λΈ”λ‘κΉŒμ§€ μœ„μ˜ κ·œμΉ™μœΌλ‘œ λͺ¨λ‘ λ†“μ•˜μŠ΅λ‹ˆλ‹€.

κ·Έλ ™μ‹œμ˜ μ‹œμž₯λ‹˜μ€ νŠΉμ • κ΅¬κ°„μ˜ μ–΄λ–€ 블둝이 κΉ”λ € μžˆλŠ”μ§€ μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

ꡬ간을 λ‚˜νƒ€λ‚΄λŠ” 두 수 begin, end κ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄ 질 λ•Œ, κ·Έ ꡬ간에 κΉ”λ € μžˆλŠ” λΈ”λ‘μ˜ 숫자 λ°°μ—΄(리슀트)을 returnν•˜λŠ” solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄ μ£Όμ„Έμš”.

μ œν•œ 사항

  • begin, end λŠ” 1 이상 1,000,000,000μ΄ν•˜μ˜ μžμ—°μˆ˜ 이고, beginλŠ” 항상 end보닀 μž‘μŠ΅λ‹ˆλ‹€.
  • end - begin 의 값은 항상 10,000을 λ„˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

begin end result
1 10 [0, 1, 1, 2, 1, 3, 1, 4, 3, 5]

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1
λ‹€μŒκ³Ό 같이 λΈ”λŸ­μ΄ κΉ”λ¦¬κ²Œ λ©λ‹ˆλ‹€.

β€» 곡지 - 2019λ…„ 4μ›” 07일 ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€κ°€ λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ°˜μ‘ν˜•