문제 URL:
2577번: 숫자의 개수
첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 같거나 크고, 1,000보다 작은 자연수이다.
www.acmicpc.net
이 문제는 a, b, c를 곱한 값에서 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램으로
문제를 처음 풀 때는 입력 받은 정수를 string으로 바꾸어 string의 각 요소를 사용하려고 했지만
각 요소를 다시 정수로 바꿀 방법이 없어서 (있기야 하겠지만 복잡할 것 같아서)
각 자릿수를 추출하는 방법으로 다시 생각해봤다.
하지만 각 자릿수를 추출할 때, 가장 높은 자리부터 추출하려고 하니 코드가 너무 어려워졌다.
그래서 다시 string을 쓰는 방법으로 돌아가야하나 고민하던 중
인터넷 검색을 통해 가장 낮은 자리의 자릿수부터 추출하면 편리하다는 것을 깨달았다.
따라서 다시 푼 방법은 다음과 같다.
a, b, c를 곱한 값에서 가장 낮은 자리부터 자릿수를 추출하고,
추출된 자릿수를 조건으로 넣은 switch문을 이용하여 각각의 경우마다 미리 만들어 둔 배열의 요소를 증가시켰다.
이 과정을 거치면 배열의 요소 안에 각 숫자의 빈도수가 저장되어 있으므로
결과적으로 배열의 요소들을 출력하여 출력 결과와 같게 만들어주었다.
#include<iostream>
using namespace std;
int main()
{
int a,b,c,x;
cin >> a;
cin >> b;
cin >> c;
int n=a*b*c;
int list[10]={0,};
while(n!=0)
{
x = n%10;
n = n/10;
switch(x)
{
case 0: list[0]++; break;
case 1: list[1]++; break;
case 2: list[2]++; break;
case 3: list[3]++; break;
case 4: list[4]++; break;
case 5: list[5]++; break;
case 6: list[6]++; break;
case 7: list[7]++; break;
case 8: list[8]++; break;
case 9: list[9]++; break;
}
}
for(int i=0; i<10; i++)
cout << list[i] << '\n';
}
2021.1.6
이 문제를 string을 이용하여 다시 한 번 풀어보았다.
switch를 사용하여 문제를 푼다는 점에서 위의 풀이와 비슷했지만,
이번 풀이에서는 a, b, c를 곱한 값을 문자열로 변환시켜줬다는 점에서 차이가 있다.
코드는 아래와 같다.
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main()
{
int a,b,c;
cin >> a;
cin >> b;
cin >> c;
int n = a*b*c;
stringstream ss;
ss << n;
string s = ss.str();
int list[10] = {0,};
for(int i=0; i<s.length(); i++)
{
switch(s[i])
{
case '0': list[0]++; break;
case '1': list[1]++; break;
case '2': list[2]++; break;
case '3': list[3]++; break;
case '4': list[4]++; break;
case '5': list[5]++; break;
case '6': list[6]++; break;
case '7': list[7]++; break;
case '8': list[8]++; break;
case '9': list[9]++; break;
}
}
for(int i=0; i<10; i++)
cout << list[i] << '\n';
}