작성일 :

문제 링크

16676번 - 근우의 다이어리 꾸미기

설명

0부터 N까지 모든 수를 표현하려면 각 숫자 스티커를 몇 장씩 준비해야 하는지 구하는 문제입니다.


접근법

먼저 N의 자릿수를 계산합니다.

다음으로 자릿수에서 1을 뺀 개수만큼 1로 이루어진 수를 만듭니다. 예를 들어 자릿수가 3이면 111을 만듭니다. 이 수가 원래 N보다 크면 자릿수에서 1을 뺀 값이 답이고, 그렇지 않으면 자릿수가 답입니다.


Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;

class Program {
  static void Main() {
    var n = int.Parse(Console.ReadLine()!);

    var tmp = n;
    var digit = 0;
    while (true) {
      if (n <= 0)
        break;
      n /= 10;
      digit++;
    }

    var a = 1;
    for (var i = 1; i < digit; i++)
      a = a * 10 + 1;

    if (digit == 0) Console.WriteLine(1);
    else if (a > tmp) Console.WriteLine(digit - 1);
    else Console.WriteLine(digit);
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n; cin >> n;

  int tmp = n, digit = 0;
  while (true) {
    if (n <= 0)
      break;
    n /= 10;
    digit++;
  }

  int a = 1;
  for (int i = 1; i < digit; i++)
    a = a * 10 + 1;

  if (digit == 0) cout << 1;
  else if (a > tmp) cout << digit - 1;
  else cout << digit;

  cout << "\n";

  return 0;
}