SWLUG/λ°±μ€€ BEAKJOON

[BAEKJOON/ λ°±μ€€] 2231번: λΆ„ν•΄ν•©

waterproof 2024. 5. 8. 14:58

https://www.acmicpc.net/problem/2231

 


[1] 문제 풀이

 

n = int(input())  # 뢄해합을 μž…λ ₯κ°’μœΌλ‘œ λ°›μŒ

for i in range(1, n+1):   # ν•΄λ‹Ή λΆ„ν•΄ν•©μ˜ μƒμ„±μž μ°ΎκΈ°
    num = sum((map(int, str(i))))  # i의 각 자릿수λ₯Ό 더함
    num_sum = i + num  # λΆ„ν•΄ν•© = μƒμ„±μž + 각 자릿수의 ν•©
    # iκ°€ μž‘μ€ μˆ˜λΆ€ν„° μ°¨λ‘€λ‘œ λ“€μ–΄κ°€λ―€λ‘œ 처음으둜 λΆ„ν•΄ν•©κ³Ό μž…λ ₯값이 κ°™μ„λ•Œκ°€ κ°€μž₯ μž‘μ€ μƒμ„±μžλ₯Ό 가짐
    if num_sum == n:
        print(i)
        break
    if i == n:  # μƒμ„±μž i와 μž…λ ₯값이 κ°™λ‹€λŠ” 것은 μƒμ„±μžκ°€ μ—†λ‹€λŠ” 뜻
        print(0)

 

 

  • n = int(input()): μ‚¬μš©μžλ‘œλΆ€ν„° 뢄해합을 μž…λ ₯κ°’μœΌλ‘œ λ°›λŠ”λ‹€.
  • for i in range(1, n+1):: 1λΆ€ν„° μž…λ ₯κ°’κΉŒμ§€μ˜ λͺ¨λ“  μˆ˜μ— λŒ€ν•΄ λ°˜λ³΅ν•œλ‹€. 이 λ²”μœ„ μ•ˆμ—μ„œ 각 μˆ«μžμ— λŒ€ν•΄ μƒμ„±μžλ₯Ό μ°ΎλŠ”λ‹€.
  • num = sum((map(int, str(i)))): ν˜„μž¬ 숫자 i의 각 자릿수λ₯Ό λ”ν•˜μ—¬ 뢄해합을 κ΅¬ν•œλ‹€. str(i)λ₯Ό μ‚¬μš©ν•˜μ—¬ 숫자λ₯Ό λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜κ³ , map(int, str(i))λ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄μ˜ 각 문자λ₯Ό 숫자둜 λ³€ν™˜ν•œ λ’€, sum() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 자릿수의 합을 κ΅¬ν•œλ‹€.

βœ”οΈ 두 번 λ³€ν™˜ν•˜λŠ” 이유?

 

두 번 λ³€ν™˜ν•˜λŠ” μ΄μœ λŠ” 주어진 숫자λ₯Ό 각 자릿수둜 λΆ„λ¦¬ν•˜μ—¬ 각 자릿수의 합을 κ΅¬ν•˜κΈ° μœ„ν•¨μ΄λ‹€.

μ²˜μŒμ— 숫자λ₯Ό λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜λŠ” μ΄μœ λŠ”, λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜λ©΄ 숫자λ₯Ό 각 자릿수둜 λΆ„λ¦¬ν•˜κΈ° μ‰¬μ›Œμ§€κΈ° λ•Œλ¬Έμ΄λ‹€. 예λ₯Ό λ“€μ–΄, 숫자 123은 λ¬Έμžμ—΄ "123"으둜 λ³€ν™˜λ˜λ©°, 이λ₯Ό μˆœνšŒν•˜λ©΄ 각각의 자릿수인 '1', '2', '3'에 μ ‘κ·Όν•  수 μžˆλ‹€.

두 번째둜 λ¬Έμžμ—΄μ˜ 각 문자λ₯Ό λ‹€μ‹œ μ •μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” μ΄μœ λŠ”, λ¬Έμžμ—΄λ‘œ λ³€ν™˜λœ 각 자릿수λ₯Ό 숫자둜 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€. λ¬Έμžμ—΄λ‘œ 처리된 각 μžλ¦Ώμˆ˜λŠ” 사싀상 문자둜 μΈμ‹λ˜λ―€λ‘œ, 숫자둜 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ •μˆ˜ν˜•μœΌλ‘œ λ³€ν™˜ν•΄μ•Ό ν•œλ‹€.

λ”°λΌμ„œ, μ²˜μŒμ— 숫자λ₯Ό λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜κ³ , 이후에 λ¬Έμžμ—΄μ˜ 각 문자λ₯Ό λ‹€μ‹œ μ •μˆ˜λ‘œ λ³€ν™˜ν•˜μ—¬ 각 자릿수의 합을 κ³„μ‚°ν•˜λŠ” 과정이 ν•„μš”ν•˜λ‹€.

 

 

  • num_sum = i + num: 뢄해합은 μƒμ„±μžμΈ i와 각 자릿수의 합인 num을 λ”ν•œ 값이닀.
  • if num_sum == n:: λΆ„ν•΄ν•©κ³Ό μž…λ ₯값이 같을 λ•Œ, 즉 λΆ„ν•΄ν•©μ˜ μƒμ„±μžλ₯Ό 찾은 κ²½μš°μ΄λ‹€.
  • print(i): κ°€μž₯ μž‘μ€ μƒμ„±μžλ₯Ό 좜λ ₯ν•œλ‹€,
  • break: μƒμ„±μžλ₯Ό μ°Ύμ•˜μœΌλ―€λ‘œ 더 이상 λ°˜λ³΅ν•  ν•„μš”κ°€ μ—†μœΌλ―€λ‘œ λ°˜λ³΅λ¬Έμ„ μ’…λ£Œν•œλ‹€.
  • if i == n:: μƒμ„±μžλ₯Ό 찾지 λͺ»ν•œ 경우, 즉 λͺ¨λ“  수λ₯Ό ν™•μΈν–ˆμ§€λ§Œ λΆ„ν•΄ν•©μ˜ μƒμ„±μžκ°€ μ—†λŠ” κ²½μš°μ΄λ‹€.
  • print(0): μƒμ„±μžκ°€ μ—†λ‹€λŠ” 의미둜 0을 좜λ ₯ν•œλ‹€.

 

 

βœ”οΈ μ˜ˆμ‹œ: 216

μ‚¬μš©μžλ‘œλΆ€ν„° μž…λ ₯κ°’μœΌλ‘œ 뢄해합을 λ°›λŠ”λ‹€. 이 μ˜ˆμ‹œμ—μ„œλŠ” 216을 μž…λ ₯κ°’μœΌλ‘œ λ°›λŠ”λ‹€.

for i in range(1, n+1):λ₯Ό 톡해 1λΆ€ν„° μž…λ ₯κ°’κΉŒμ§€μ˜ λͺ¨λ“  μˆ˜μ— λŒ€ν•΄ λ°˜λ³΅ν•œλ‹€. λ”°λΌμ„œ 이 μ½”λ“œμ—μ„œλŠ” 1λΆ€ν„° 216κΉŒμ§€μ˜ μˆ˜μ— λŒ€ν•΄ λ°˜λ³΅ν•˜κ²Œ λœλ‹€.

반볡문 λ‚΄λΆ€μ—μ„œλŠ” κ° μˆ«μž i에 λŒ€ν•΄ λ‹€μŒμ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€:
num = sum((map(int, str(i)))): ν˜„μž¬ 숫자 i의 각 자릿수λ₯Ό λ”ν•˜μ—¬ 뢄해합을 κ΅¬ν•œλ‹€. 즉, 각 자릿수λ₯Ό λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜κ³  이λ₯Ό μ •μˆ˜λ‘œ λ§€ν•‘ν•œ λ’€, 이λ₯Ό λͺ¨λ‘ ν•©ν•˜μ—¬ 자릿수의 합을 κ΅¬ν•œλ‹€. 216의 각 자릿수의 합은 2 + 1 + 6 = 9κ°€ λœλ‹€.

num_sum = i + num: 뢄해합은 μƒμ„±μžμΈ i와 각 자릿수의 합인 num을 λ”ν•œ 값이닀.
if num_sum == n:을 톡해 λΆ„ν•΄ν•©κ³Ό μž…λ ₯값이 같은지 ν™•μΈν•œλ‹€. 즉, ν˜„μž¬ 숫자 iκ°€ μƒμ„±μžμΌ λ•Œμ΄λ‹€.

num_sum이 216κ³Ό 같은지 ν™•μΈν•œλ‹€.

λ§Œμ•½ κ°™λ‹€λ©΄, 이 숫자 iκ°€ μž…λ ₯값에 λŒ€ν•œ κ°€μž₯ μž‘μ€ μƒμ„±μžμ΄λ‹€. λ”°λΌμ„œ 이 값을 좜λ ₯ν•˜κ³  λ°˜λ³΅λ¬Έμ„ μ’…λ£Œν•œλ‹€.

if i == n:을 톡해 μƒμ„±μžλ₯Ό 찾지 λͺ»ν•œ 경우, 즉 λͺ¨λ“  수λ₯Ό ν™•μΈν–ˆμ§€λ§Œ λΆ„ν•΄ν•©μ˜ μƒμ„±μžκ°€ μ—†λŠ” 경우λ₯Ό μ²˜λ¦¬ν•œλ‹€.

 

 

 


[2] λŠλ‚€ 점

 

μ½”λ“œ κΈΈμ΄λŠ” μ§§μ§€λ§Œ 이 μ•Œκ³ λ¦¬μ¦˜μ„ λ– μ˜¬λ¦¬λŠ” 건 μ–΄λ €μš΄ 것 κ°™λ‹€...πŸ₯²

μ—¬λŸ¬ 문제λ₯Ό μ ‘ν•΄λ³΄λ©΄μ„œ μƒˆλ‘œμš΄ 아이디어λ₯Ό 자꾸 λ– μ˜¬λ¦¬κ²Œ λ˜μ–΄μ„œ 쑰금 κ³ ν†΅μŠ€λŸ¬μ› μ§€λ§Œ μ’‹μ•˜λ‹€!