λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

μ½”λ”© ν…ŒμŠ€νŠΈ/Baejoon

[λ°±μ€€] 6. ν•¨μˆ˜

15596 : μ •μˆ˜ N개의 ν•©

πŸ“– λ¬Έμ œ

μ •μˆ˜ nκ°œκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, n개의 합을 κ΅¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜μ‹œμ˜€.

μž‘μ„±ν•΄μ•Ό ν•˜λŠ” ν•¨μˆ˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

     - Python2, Python3, PyPy, PyPy3 : def solve(a : list) -> int

              a : 합을 ꡬ해야 ν•˜λŠ” μ •μˆ˜ nκ°œκ°€ μ €μž₯λ˜μ–΄ μžˆλŠ” 리슀트

              (0 ≤ a[i] ≤ 1,000,000, 1 ≤ n ≤ 3,000,000)

πŸ‘€ μΆœμ œμ˜λ„

ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ”μ§€

🧾 μ½”λ“œ

def solve(n): # ν•¨μˆ˜μ— n을 μž…λ ₯ μ‹œ
    ans = 0 # ansλ₯Ό 0으둜 μ΄ˆκΈ°ν™”
    ans += sum(n) # nλ₯Ό λ”ν•œ 값을 ans에 μ €μž₯ 
    return ans # ans λ°˜ν™˜

πŸ’» ν’€μ΄μ„€λͺ…

1. ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜μ—¬ n이 μž…λ ₯됐을 μ‹œ μ‹€ν–‰λœλ‹€.

2. sum()을 μ΄μš©ν•˜μ—¬ n을 λ”ν•œ 값을 ans에 μ €μž₯함.

3. n을 λ”ν•œ 값을 λ°˜ν™˜ν•¨.

πŸ“ ν•™μŠ΅λ°©λ²•

python ν•¨μˆ˜ μ •μ˜ν•˜λŠ” 방법 ν•™μŠ΅ν•˜κΈ°.


4673 : μ…€ν”„ λ„˜λ²„

πŸ“– λ¬Έμ œ

μ…€ν”„ λ„˜λ²„λŠ” 1949λ…„ 인도 μˆ˜ν•™μž D.R Kaprekarκ°€ 이름 λΆ™μ˜€λ‹€. μ–‘μ˜ μ •μˆ˜ n에 d(n)을 nκ³Ό n의 각 자리 수λ₯Ό λ”ν•˜λŠ” ν•¨μˆ˜λΌκ³  μ •μ˜ν•˜μž. 예λ₯Ό λ“€μ–΄ d(75) = 75+7+5 = 87이닀.

 

μ–‘μ˜ μ •μˆ˜ n이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 이 수λ₯Ό μ‹œμž‘ν•΄μ„œ n, d(n), d(d(n)), d(d(d(n))), ...κ³Ό 같은 λ¬΄ν•œ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€.

 

예λ₯Ό λ“€μ–΄, 33으둜 μ‹œμž‘ν•˜λ‹€λ©΄ λ‹€μŒ μˆ˜λŠ” 33+3+3 = 39이고, κ·Έ λ‹€μŒ μˆ˜λŠ” 39+3+9 = 51, λ‹€μŒ μˆ˜λŠ” 51+5+1 = 57이닀. μ΄λŸ°μ‹μœΌλ‘œ λ‹€μŒκ³Ό 같은 μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€.

 

33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...

 

n을 d(n)의 μƒμ„±μžλΌκ³  ν•œλ‹€. μœ„μ˜ μˆ˜μ—΄μ—μ„œ 33은 39의 μƒμ„±μžμ΄κ³ , 39λŠ” 51의 μƒμ„±μž, 51은 57의 μƒμ„±μžμ΄λ‹€. μƒμ„±μžκ°€ ν•œ κ°œλ³΄λ‹€ λ§Žμ€ κ²½μš°λ„ μžˆλ‹€. 예λ₯Ό λ“€μ–΄, 101은 μƒμ„±μžκ°€ 2개(91κ³Ό 100) μžˆλ‹€.

 

μƒμ„±μžκ°€ μ—†λŠ” 숫자λ₯Ό μ…€ν”„ λ„˜λ²„λΌκ³  ν•œλ‹€. 100보닀 μž‘μ€ μ…€ν”„ λ„˜λ²„λŠ” 총 13κ°œκ°€ μžˆλ‹€. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 89, 97

 

10000보닀 μž‘κ±°λ‚˜ 같은 μ…€ν”„ λ„˜λ²„λ₯Ό ν•œ 쀄에 ν•˜λ‚˜μ”© 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

πŸ‘€ μΆœμ œμ˜λ„

숫자λ₯Ό μžλ¦Ώμˆ˜λŒ€λ‘œ λ‚˜λˆ„μ–΄ 계산이 κ°€λŠ₯ν•œμ§€

🧾 μ½”λ“œ

numbers = set(range(1, 10000)) # 10000보닀 μž‘κ±°λ‚˜ 같은 λ²”μœ„μ΄λ―€λ‘œ set()κ³Ό range()을 μ΄μš©ν•˜μ—¬ 1λΆ€ν„° 10000κΉŒμ§€ λ²”μœ„ μ„€μ •
numbers_set = set() # set() ν•¨μˆ˜ -> μ§‘ν•©μœΌλ‘œ 쀑볡을 μ—†μ•°
for num in numbers: # 1λΆ€ν„° 10000κΉŒμ§€ 반볡
    for n in str(num): # num을 str()을 μ΄μš©ν•˜μ—¬ λ¬Έμžμ—΄λ‘œ λ³€ν™˜ ν›„ 반볡(75일 경우 7, 5처럼 ν•˜λ‚˜μ”© λ–Όμ–΄λ‚΄κΈ° μœ„ν•΄)
        num += int(n) # n을 int()을 μ΄μš©ν•˜μ—¬ μ •μˆ˜λ‘œ λ³€ν™˜ ν›„ 더함(75일 경우 75+7+5의 값을 μ €μž₯)
    numbers_set.add(num) # numbers_set에 자리 수λ₯Ό λΆ„λ¦¬ν•˜μ—¬ λ”ν•œκ°’μ„ add()을 μ΄μš©ν•˜μ—¬ μ €μž₯함

self_number = numbers - numbers_set # μƒμ„±μžκ°€ μ—†λŠ” 숫자인 μ…€ν”„λ„˜λ²„λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄ 1λΆ€ν„° 10000κΉŒμ§€μ™€ μƒμ„±μžλ‘œ μƒκ²¨λ‚œ 수λ₯Ό λΉΌμ–΄ ꡬ함
for self_num in sorted(self_number): # self_numbersλ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 정렬함
    print(self_num) # μ…€ν”„λ„˜λ²„ 좜λ ₯

πŸ’» ν’€μ΄μ„€λͺ…

1. number λ³€μˆ˜μ— set()κ³Ό range()을 μ΄μš©ν•˜μ—¬ 1λΆ€ν„° 10000κΉŒμ§€μ˜ λ²”μœ„λ₯Ό μ„€μ •ν•˜μ—¬ μ €μž₯함.

2. number_set λ³€μˆ˜μ— set()을 μ €μž₯.

3. for문을 μ‚¬μš©ν•˜μ—¬ 1λΆ€ν„° 10000κΉŒμ§€ 반볡.

4. 숫자λ₯Ό μžλ¦Ώμˆ˜λŒ€λ‘œ ν•˜λ‚˜μ”© λ‚˜λˆ„κΈ° μœ„ν•˜μ—¬ num을 λ¬Έμžμ—΄λ‘œ λ³€ν™˜ ν›„ λ°˜λ³΅ν•˜κ³  μžλ¦Ώμˆ˜λŒ€λ‘œ λ‚˜λˆˆ 것을 λͺ¨λ‘ λ”ν•˜κΈ° μœ„ν•΄ μ •μˆ˜ν˜•μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ λ”ν•˜κ³  numbers_set λ³€μˆ˜μ— μ €μž₯함.

5. 1λΆ€ν„° 10000κΉŒμ§€μ˜ λ²”μœ„μΈ numbersκ³Ό μ…€ν”„ λ„˜λ²„κ°€ μ•„λ‹Œ μˆ˜κ°€ μ €μž₯λ˜μ–΄ μžˆλŠ” numbers_set을 λΉΌμ–΄ μ…€ν”„ λ„˜λ²„λ₯Ό ꡬ함.

6. self_number을 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜μ—¬ 좜λ ₯함.

πŸ“ ν•™μŠ΅λ°©λ²•

숫자λ₯Ό μžλ¦Ώμˆ˜λŒ€λ‘œ λ‚˜λˆ„λŠ” 방법을 ν•™μŠ΅ν•˜κΈ°.


1065 : ν•œμˆ˜

πŸ“– λ¬Έμ œ

μ–΄λ–€ μ–‘μ˜ μ •μˆ˜ X의 각 μžλ¦¬κ°€ λ“±μ°¨μˆ˜μ—΄μ„ 이룬닀면, κ·Έ 수λ₯Ό ν•œμˆ˜λΌκ³  ν•œλ‹€.

λ“±μ°¨μˆ˜μ—΄μ€ μ—°μ†λœ 두 개의 수의 차이가 μΌμ •ν•œ μˆ˜μ—΄μ„ λ§ν•œλ‹€.

N이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , N보닀 μž‘κ±°λ‚˜ 같은 ν•œμˆ˜μ˜ 개수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

πŸ‘€ μΆœμ œμ˜λ„

숫자λ₯Ό μžλ¦Ώμˆ˜λŒ€λ‘œ λ‚˜λˆ„μ–΄ 계산이 κ°€λŠ₯ν•œμ§€

🧾 μ½”λ“œ

n = int(input()) # λ²”μœ„ μž…λ ₯
han = 0

for i in range(1, n + 1): # 1λΆ€ν„° μž…λ ₯ν•œ λ²”μœ„κΉŒμ§€ 반볡
    if i < 100: # λ§Œμ•½ iκ°€ 100보닀 μž‘μ„ 경우 (1λΆ€ν„° 99κΉŒμ§€λŠ” λͺ¨λ‘ ν•œμˆ˜μ΄λ‹€)
        han += 1 # 1을 증가
    else: # 100μ΄κ±°λ‚˜ 100보닀 클 경우
        ns = list(map(int, str(i))) # map()을 μ΄μš©ν•˜μ—¬ iλ₯Ό λ¬Έμžμ—΄λ‘œ λ³€ν™˜ ν›„ λ¦¬μŠ€νŠΈμ— μ €μž₯ν•˜κ³  μ •μˆ˜ν˜•μœΌλ‘œ λ³€ν™˜(숫자λ₯Ό μžλ¦Ώμˆ˜λŒ€λ‘œ 뢄리)
        if ns[0] - ns[1] == ns[1] - ns[2]: # λ§Œμ•½ 첫 번째 숫자 - 두 번째 μˆ«μžμ™€ 두 번째 숫자 - λ§ˆμ§€λ§‰ 숫자의 값이 같을 경우 λ“±μ°¨μˆ˜μ—΄μ΄λ‹€.
            han += 1 # 1을 증가
print(han) # ν•œμˆ˜ 좜λ ₯

 

πŸ’» ν’€μ΄μ„€λͺ…

1. n에 λ²”μœ„λ₯Ό μž…λ ₯ν•œ 것을 μ €μž₯ν•œλ‹€.

2. for문을 μ΄μš©ν•˜μ—¬ 1λΆ€ν„° μž…λ ₯ν•œ λ²”μœ„κΉŒμ§€ λ°˜λ³΅ν•œλ‹€.

3. 1λΆ€ν„° 99κΉŒμ§€λŠ” λͺ¨λ‘ ν•œμˆ˜μ΄λ―€λ‘œ if문을 μ΄μš©ν•˜μ—¬ iκ°€ 100보닀 μž‘μ„ 경우 ν•œμˆ˜ 개수λ₯Ό 1을 μ¦κ°€μ‹œν‚¨λ‹€.

3. 100μ΄κ±°λ‚˜ 100 이상일 경우,  숫자λ₯Ό μžλ¦Ώμˆ˜λŒ€λ‘œ λΆ„λ¦¬ν•˜μ—¬ λ¦¬μŠ€νŠΈμ— μ €μž₯ν•˜κ³  첫 번째 숫자 - 두 번째 숫자의 κ°’κ³Ό 두 번째 숫자 - λ§ˆμ§€λ§‰ 숫자의 값이 같을 경우 λ“±μ°¨μˆ˜μ—΄μ΄λ―€λ‘œ ν•œμˆ˜ 개수λ₯Ό 1 μ¦κ°€μ‹œν‚¨λ‹€.

πŸ“ ν•™μŠ΅λ°©λ²•

숫자λ₯Ό μžλ¦Ώμˆ˜λŒ€λ‘œ λ‚˜λˆ„λŠ” 방법을 ν•™μŠ΅ν•˜κΈ°.