[알고리즘] 문제풀이 연습

[알골 90제] 13번 - 가장 많이 상용된 자릿수

ddgoori 2019. 7. 13. 13:57

13번

 

N자리의 자연수가 입력되면 입력된 자연수의 자릿수 중 가장 많이 사용된 숫자를 출력하는 프로그램

예를 들어 1123521355512315555라는 자연수가 입력되면 5가 가장 많이 사용된 숫자이므로 답.

답이 여러 개일 경우 그 중 가장 큰 수를 출력하시오.

 

입력 : 첫 줄에 자연수가 입력됨. 자연수의 길이는 100을 넘지 않는다.

출력 : 가장 많이 사용된 숫자 출력

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
using namespace std;

int main() {

	int digit[10] = { 0, };
	int N, max = -9999999, res, temp;
	char num[101];

	scanf("%s", &num);
	for (int i = 0; num[i] != '\0'; i++) {
		temp = num[i] - 48; //문자형 숫자를 숫자형으로
		digit[temp]++; //배열안의 값으로 배열 번호를 구해서 값 증가시킴
	}
	
	for (int i = 0; i <= 9; i++) {
		if (digit[i] >= max) {
			max = digit[i];
			res = i;
		}
	}

	printf("%d", res);
}

 

  •  0~9까지 총 10개의 자릿수를 카운트 할 배열이 필요하다. int digit[10]
  • 입력을 받을 자연수 100개 만큼의 배열 공간이 필요하다. char num[101] 이때, char로 해주는 이유는 string으로 받기 위해서 이다. 배열이 101개인 이유는 캐릭터는 마지막 배열 끝에 '\0'가 붙기 때문이다. 이 배열에 입력 값을 넣어준다. scanf("%s", &num)
  • 입력된 숫자가 각 배열 칸에 담긴 num배열을 0부터 하나씩 검사하며, 해당 배열의 번호가 아닌 그 번호에 해당하는 값을 자릿수를 계산하는 digit배열번호 수를 ++1개씩 올려준다. 입력된 값을 1개씩 확인하며 해당되는 자릿수를 카운트하여 가장 많이 카운트 된 숫자를 뽑기 위해서다. 이때, 중요한 것은 num 배열은 char이기 때문에 숫자형 숫자로 인식하기 위해서는 -48 해줘야 한다. ex)아스키코드!
  • 이제 입력한 숫자들의 자릿수를 다 카운트해서 digit 배열에 담아 두었다. 그 담아둔 것 중에 각 배열들을 서로 비교해서 가장 큰것을 찾아주고 가장큰 배열의 자릿수 즉, = 배열번호 를 출려해주면 된다. 이때 주의할 것은, 배열안에 담긴 count된 값 즉 digit[0]이 6번 카운트되면 값 6이 담겨있는데, 6이 아닌 바로 0을 출력해줘야한다는 것이다. 가장 많은 "자릿수"이기 때문이다.
  • 비교할 때는 for문을 이용하는데 만약 max(최저값으로 미리설정해둠) 보다 같거나 해당 되는 배열의 값이 더 크면, 그 배열의 값이 max가 된다. 그리고 max를 만드는 배열의 번호 i번째가 답이 된다. 반복을 통해 가장 많이 ++된 값을 찾고 그 값의 자리번호인 i를 출력한다.