문제
N자리의 자연수가 입력되면 입력된 자연수의 자릿수 중 가장 많이 사용된 숫자를 출력하는 프 로그램을 작성하세요. 예를 들어 1230565625라는 자연수가 입력되면 5가 3번 상용되어 가장 많이 사용된 숫자입니 다. 답이 여러 개일 경우 그 중 가장 큰 수를 출력하세요.
💡 입력설명
첫 줄에 자연수가 입력됩니다. 자연수의 길이는 100을 넘지 않습니다.
💡 출력설명
자릿수의 곱을 출력합니다.
💡 입력예제
1230565625
💡 출력예제
5
코드
첫 번째 풀이
#include <stdio.h>
int main () {
char n[101];
int arr[10] = {0, };
int i, j, max = -2147000000, num;
scanf("%s", &n);
for(i = 0; n[i] != '\0'; i++) {
for(j = 0; j <= 9; j++) {
if((n[i] - 48) == j) {
arr[j] += 1;
break;
}
}
}
for(i = 0; i < 10; i++) {
if(arr[i] > max) {
max = arr[i];
num = i;
}
if(arr[i] == max) {
if(num < i) {
num = i;
}
}
}
printf("%d", num);
return 0;
}
최종 풀이
#include <stdio.h>
int arr[10];
int main () {
char n[100];
int i, digit, max = -2147000000, res;
scanf("%s", &n);
// count
for(i = 0; n[i] != '\0'; i++) {
digit = n[i] - 48;
arr[digit]++;
}
for(i = 0; i < 10; i++) {
if(arr[i] >= max) {
max = arr[i];
res = i;
}
}
printf("%d", res);
return 0;
}
설명
사용자로부터 N자리 자연수를 입력받고 n에 할당한다.
N자리 자연수 만큼 반복하는 for문을 작성하고 각 자리의 자연수는 문자열 형태이므로 -48을 하여 정수형으로 바꾼다. 바꾼 자연수를 digit에 할당하고 digit 해당하는 arr index에 1씩 counting하도록 한다.
arr를 0~9만큼 반복하는 for문을 작성한다.
각 자리의 자연수에 해당하는 count가 max보다 이상(count가 max와 같을 경우 자동으로 큰 값을 할당하기 위해)일 경우 각 자리의 자연수를 max에, 해당 index를 res에 할당하여 최종적으로 res를 출력하도록 작성한다.
배운 점
1. int 배열을 전역변수로 할당하면 0으로 초기화된다. (지역변수: int arr[10] = {0, })
각 자리의 자연수를 0~9까지 for문을 돌려 i에 해당하는 자연수면 counting해서 break;하도록 했는데 원리를 조금만 더 파악했으면 굳이 for문을 사용하지 않아됬었다.
또 count와 max같은 경우 따로 조건문을 세웠는데 그렇지 않고도 count가 max보다 이상이면 같았을 경우를 고려해서 할당된다는 것을 알게되었다.
해당 내용은 김태원님의 'it 취업을 위한 알고리즘 문제풀이' 강의를 듣고 작성한 글입니다.