초보 개발자의 이야기, 릿허브

[C] 백준 11170번 0의 개수 본문

코딩테스트/📗 백준 (BOJ)

[C] 백준 11170번 0의 개수

릿99 2021. 7. 28. 15:40
728x90
반응형
1. 문제이해

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

 

11170번: 0의 개수

N부터 M까지의 수들을 종이에 적었을 때 종이에 적힌 0들을 세는 프로그램을 작성하라. 예를 들어, N, M이 각각 0, 10일 때 0을 세면 0에 하나, 10에 하나가 있으므로 답은 2이다.

www.acmicpc.net

 

테스트케이스의 개수(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문제가 될때까지 차곡차곡 쌓아나가야지😊

 

 

 

 

 

728x90
반응형