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

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

by nitronium102 2021. 8. 27.

문제

μ–΄λ–€ μžμ—°μˆ˜ N이 μžˆμ„ λ•Œ, κ·Έ μžμ—°μˆ˜ N의 뢄해합은 Nκ³Ό N을 μ΄λ£¨λŠ” 각 자리수의 합을 μ˜λ―Έν•œλ‹€. μ–΄λ–€ μžμ—°μˆ˜ M의 뢄해합이 N인 경우, M을 N의 μƒμ„±μžλΌ ν•œλ‹€. 예λ₯Ό λ“€μ–΄, 245의 뢄해합은 256(=245+2+4+5)이 λœλ‹€. λ”°λΌμ„œ 245λŠ” 256의 μƒμ„±μžκ°€ λœλ‹€. λ¬Όλ‘ , μ–΄λ–€ μžμ—°μˆ˜μ˜ κ²½μš°μ—λŠ” μƒμ„±μžκ°€ 없을 μˆ˜λ„ μžˆλ‹€. λ°˜λŒ€λ‘œ, μƒμ„±μžκ°€ μ—¬λŸ¬ 개인 μžμ—°μˆ˜λ„ μžˆμ„ 수 μžˆλ‹€.

μžμ—°μˆ˜ N이 μ£Όμ–΄μ‘Œμ„ λ•Œ, N의 κ°€μž₯ μž‘μ€ μƒμ„±μžλ₯Ό κ΅¬ν•΄λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 μžμ—°μˆ˜ N(1 ≤ N ≤ 1,000,000)이 주어진닀.

좜λ ₯

첫째 쀄에 닡을 좜λ ₯ν•œλ‹€. μƒμ„±μžκ°€ μ—†λŠ” κ²½μš°μ—λŠ” 0을 좜λ ₯ν•œλ‹€.

풀이

1λΆ€ν„° iλ₯Ό ν•˜λ‚˜μ”© μ¦κ°€μ‹œμΌœκ°€λ©° μƒμ„±μžλ₯Ό μ°ΎλŠ”λ‹€. λ§Œμ•½ μƒμ„±μžλ₯Ό μ°ΎλŠ”λ‹€λ©΄ λ°”λ‘œ breakν•˜μ—¬ μ΅œμ†Œκ°€ 될 수 μžˆλ„λ‘ ν•œλ‹€.

이 λ•Œ, 1λΆ€ν„°μ˜ 뢄해합을 λͺ¨λ‘ κ΅¬ν•˜λ©΄ λΉ„νš¨μœ¨μ μ΄λ―€λ‘œ μ‘°κΈˆμ΄λ‚˜λ§ˆ μ—°μ‚°νšŸμˆ˜λ₯Ό 쀄일 수 μžˆλ„λ‘ μ‹œμž‘μ μ„ κ΅¬ν•˜λŠ” μ½”λ“œλ₯Ό μΆ”κ°€ν–ˆλ‹€. N이 3자리 숫자일경우, μ΅œμ†Œκ°’μΈ 100을 λ§Œμ‘±ν•˜λŠ” μˆ«μžλŠ” 86이닀. 
λ”°λΌμ„œ μ‹œμž‘μ μ„ N이 i자리 μˆ˜μΌλ•Œ, 10^(i-1) - 9 * (i-1)둜 μ‹œμž‘ν•˜λ„λ‘ ν•˜μ˜€λ‹€.
N의 값이 컀질수둝 λΆˆν•„μš”ν•œ μ—°μ‚°μ˜ 수λ₯Ό 크게 쀄일 수 μžˆλ‹€.
(좜처) https://cryptosalamander.tistory.com/41 

 

μƒμ„±μžλ₯Ό μ°ΎλŠ” 법칙이 있긴 ν•˜μ§€λ§Œ μ‰½κ²Œ μƒκ°ν•˜κΈ° μ–΄λ €μš°λ―€λ‘œ i=1λΆ€ν„° 해도 λ¬΄λ°©ν•˜λ‹€.

(μœ„) i=1둜 μ‹œμž‘, (μ•„λž˜) i=pow(10, i-1) - i*9둜 μ‹œμž‘. μ‹œκ°„λ©΄μ—μ„œ 큰 μ°¨μ΄λŠ” μ—†λ‹€.

 

#include <iostream>
#include <cmath>
using namespace std;

int main(){
  int N, sum, num;
  cin >> N;
  /*int tmp=N, digit=0;
  while(tmp>0){
    tmp /= 10;
    digit++;
  }

  int i = pow(10, digit-1)-9*digit;
*/
  int i=1;
  while(1){
    sum = i;
    num = i;
    while(num>0){
      sum += num%10;
      num /= 10;
    }
    if (sum == N){
      cout << i;
      break;
    }
    if (i==N){
      cout << "0";
      break;
    }
    i++;
  }
}

λŒ“κΈ€