Baekjoon / Problem No.11170 (0의 개수)
Problem
N부터 M까지의 수들을 종이에 적었을 때 종이에 적힌 0들을 세는 프로그램을 작성하라.
예를 들어, N, M이 각각 0, 10일 때 0을 세면 0에 하나, 10에 하나가 있으므로 답은 2이다.
Input
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 줄에는 N과 M이 주어진다.
- 1 ≤ T ≤ 20
- 0 ≤ N ≤ M ≤ 1,000,000
Output
각각의 테스트 케이스마다 N부터 M까지의 0의 개수를 출력한다.
Solution
우선 맨 뒷자리가 0인 수를 생각해보자.(10, 200, 265440 등)
0으로 어떤 수를 나눌 수 없기 때문에 위의 1의 자리수가 0인 수들은 '10'으로 나누어 떨어진다.
10으로 나누어 떨어진다면 그 수의 1의자리수는 0이라고 생각해도 무방하다는 뜻이다.
그렇다면 우리가 해야할 생각은 어떤 수를 받았을때, 10으로 각 자리수를 나누어보면서 10으로 얼마나 나누어 떨어지는지 알아보면 될 것이다.
코드를 보며 확인해보자.
Code
#include <cstdio>
#include <string>
using namespace std;
int main()
{
int T, N, M;
scanf("%d", &T);
for (int i = 0; i < T; i++)
{
scanf("%d %d", &N, &M);
int count = 0;
for (int j = N; j <= M; j++)
{
if (j == 0) // 범위안에 숫자 '0'이 혼자 있는 경우
count++;
int x = j; // 반복 인덱스와 자릿수 계산을 분리
while (x > 0)
{
if (x % 10 == 0) // 나누어 떨어지면 발견
count++;
x /= 10; // 자릿수를 한칸씩 당겨주기
}
}
printf("%d\n", count);
}
return 0;
}
Review
짧고 간단한 문제였다. 물론 문자열을 비교하는 방법도 있으나, 각각의 방법이 있는 것이라 생각한다.
문제를 해결하는데 왕도는 없다. 높은 산이라도 등산로가 여러가지이듯, 코딩으로 문제를 해결하는 데도 여러가지 방법이 있다. 조금 둘러가는 길도, 빠른 길도, 가파른 길도 있지만 문제를 주어진 조건에서 해결한다면 그것 역시 정답(正答)이다.
'오늘의 코드' 카테고리의 다른 글
| 오늘의 코드. 14일차 (백준/11047번 동전 0) (0) | 2024.02.21 |
|---|---|
| 오늘의 코드. 13일차 (백준/12789번 도키도키 간식드리미) (0) | 2024.02.16 |
| 오늘의 코드. 12일차 (백준/11758번 CCW) (2) | 2024.02.15 |
| 오늘의 코드. 11일차 (백준/2563번 색종이) (2) | 2024.02.14 |
| 오늘의 코드. 10일차 (백준/27960번 사격 내기) (2) | 2024.02.13 |