일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 30 | 31 |
- C
- 그리디알고리즘
- C++
- C언어
- 소수판정
- 다이나믹프로그래밍
- 사칙연산
- SQL
- 프로그래머스코딩테스트
- Image Classification
- 프로그래머스
- 논문구현
- 프로그래머스연습문제
- 정렬
- 해시를사용한집합과맵
- 정수론
- 논문리뷰
- 자료구조
- 프로그래머스sql
- 그리디
- 구현
- 이분탐색
- 이진탐색
- 큐
- 브루트포스알고리즘
- 백준알고리즘
- 백준
- 문자열
- 수학
- MySQL
- Today
- Total
초보 개발자의 이야기, 릿허브
[C] 백준 11170번 0의 개수 본문
1. 문제이해
https://www.acmicpc.net/problem/11170
테스트케이스의 개수(T)를 입력받고, 해당 개수만큼 N과 M을 입력받는다.
이후, 각각 입력받은 N과 M 사이의 0의 갯수를 출력하면 되는 알고리즘을 구현하는 것이 목표이다.
2. 문제풀이
문제의 방식은 간단하다.
주어진 각 테스트케이스의 숫자 범위 내에 있는 0의 개수를 카운트하고 출력해주면 되는 문제이다.
입력받은 숫자를 문자로 변환해 배열에 저장하고,
0이 있으면 카운트하고, 다시 1을 올려서 반복해주는 방식으로 풀이했다.
이 문제 또한 N과 M의 범위가 1,000,000 까지이므로 메모리 초과에 주의해야했는데,
저번과 동일하게 전역변수를 이용해 해결해주었다.
3. 소스코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
// 메모리 초과를 방지하기위해 전역변수로 설정
int N[1000000];
int M[1000000];
int count[1000000];
char buffer[1000000];
int main() {
int T;
int i, j, k;
// 테스트케이스의 개수와 각 테스트케이스의 경우 입력받음
scanf("%d", &T);
for (i = 0; i < T; i++) {
scanf("%d %d", &N[i], &M[i]);
}
for (i = 0; i < T; i++) {
// i번째 입력받은 숫자의 범위 내에서
for (j = N[i]; j < M[i] + 1; j++) {
// 입력받은 숫자를 문자열로 변환
sprintf(buffer, "%d", j);
for (k = 0; k < strlen(buffer); k++) {
// 각 자릿수의 숫자에 0이 있는지 확인
if (buffer[k] == '0')
count[i]++; // 있으면 count
}
}
}
for (i = 0; i < T; i++) {
printf("%d\n", count[i]);
}
return 0;
}
앞서 이야기했듯이, 메모리 초과를 방지하기 위해,
입력받을 N과 M, 0의 갯수를 세는 count,
숫자를 문자로 바꿔 저장해주는 buffer 배열을 모두 전역변수로 선언해주었다.
이후 테스트 케이스의 개수를 입력받고,
각 테스트 케이스를 N[i], M[i]에 저장, 이어지는 for문과 if문을 통해 0의 개수를 셌다.
for, if문을 자세히 보면, 해당 테스트 케이스에서, 숫자의 범위를 N과 M까지로 설정하고, 숫
자를 1씩 증감시키면서 0이 있으면 count 변수를 증감시켜주었다.
주석이 없는 코드는 왼쪽 아래 더보기를 참고하자.
<주석없는 코드>
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int N[1000000];
int M[1000000];
int count[1000000];
char buffer[1000000];
int main() {
int T;
int i, j, k;
scanf("%d", &T);
for (i = 0; i < T; i++) {
scanf("%d %d", &N[i], &M[i]);
}
for (i = 0; i < T; i++) {
for (j = N[i]; j < M[i] + 1; j++) {
sprintf(buffer, "%d", j);
for (k = 0; k < strlen(buffer); k++) {
if (buffer[k] == '0')
count[i]++;
}
}
}
for (i = 0; i < T; i++) {
printf("%d\n", count[i]);
}
return 0;
}
실버 5문제를 오늘부로 9문제 풀이했다.😆
블로그를 개설한지가 엊그제 같은데 벌써 9문제라니..
블로그 첫화면에 문제가 하나하나 채워질때마다 뿌듯한 기분이 든다.
100문제, 200문제가 될때까지 차곡차곡 쌓아나가야지😊
'코딩테스트 > 📗 백준 (BOJ)' 카테고리의 다른 글
[C++] 백준 10814번 나이순 정렬 (0) | 2021.07.30 |
---|---|
[C++] 백준 9237번 이장님 초대 (0) | 2021.07.29 |
[C++] 백준 11004번 K번째 수 (0) | 2021.07.27 |
[C++] 백준 2941번 크로아티아 알파벳 (0) | 2021.07.26 |
[C] 백준 14467번 소가 길을 건너간 이유 1 (0) | 2021.07.24 |