https://www.acmicpc.net/problem/2577
세개의 세 자릿수 자연수를 입력받고, 이들을 곱한 값에서 각 자릿수들은 어떤 숫자로 이루어져 있는지 출력하는 문제.
만약 곱한 값이 123456789라면
0
1
1
1
1
1
1
1
1
1
와 같이 출력해야 한다.
그래서 생각해낸 방법이 곱한 값을 문자열로 바꿔서 한자리씩 비교하면 될 것이라고 판단했다.
곱한 값을 일일이 10의 n승꼴로 나누어 정수형 배열로 바꿔넣는 방법도 있겠으나, 코드가 더러워 질 것 같았다.
그런데 한가지 문제가 발생했다. 정수를 온전히 문자열로 바꾸는 방법이 없었다. 그래서 알아본 결과, 두가지의 방법을 얻었다.
1. stdlib.h 헤더파일을 선언 한 후에 itoa()를 사용한다.
2. sprintf()를 사용한다.
1번의 경우 C언어의 표준함수가 아니기에(Visual Studio에 한해 사용가능) 필자는 2번 방법을 택했다.
sprint(문자열, 형식, 정수)로 입력하는데, 정수를 자신이 지정한 형식으로 문자열에 저장한다. 이때 문자열을 입력하므로 NULL문자가 삽입되어 길이에 유의해야 한다.
이렇게 정수를 문자로 바꾸는데는 성공했으니 문자를 정수로 바꿀 방법도 있어야 한다. 이 또한 두가지 방법을 찾았다.
1. stdlib.h 헤더파일에 선언된 atoi()를 사용한다.
2. 문자 하나하나가 단일문자로 이루어진 문자열이므로, 아스키코드로 바라본다.
필자는 2번째 방법을 택했다.
예시를 들자면,
char a = '8';
int b = a - '0'; // b = 8
이 될 것이다. 아스키코드 상으로 '0'은 48이고 1씩 더해지므로 아스키코드로 바라본다.
이를 이용하여 다음과 같이 풀었다.
#include<stdio.h>
int main(){
char val[10]; // 세 수를 곱한 값을 입력할 문자열, 세자리 자연수의 곱의 최댓값이 9자리수이므로 길이는 10으로 선언
int a, b, c; // 입력받을 정수
int rest[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 숫자의 개수를 저장할 배열(0,1,2....9)
int temp; // 값을 비교하기 위해 선언한 int형 변수
int i; // 반복문을 위한 인자
scanf("%d%d%d", &a, &b, &c); // a, b, c 입력 받는다.
sprintf(val, "%d", a*b*c); // 세 수의 곱을 문자열로 바꾼다.
for (i = 0; i < 10; i++) {
temp = val[i] - '0'; // 단일문자로 된 문자를 정수로 바꾼다.
rest[temp]++; // temp의 개수를 1 늘린다.
}
for (i = 0; i < 10; i++){
printf("%d\n", rest[i]);
}
return 0;
}
'coding_test > BAEKJOON' 카테고리의 다른 글
백준 4344번 C언어 풀이 (0) | 2021.08.05 |
---|---|
백준 8958번 C언어 풀이 (0) | 2021.08.05 |
백준 1546번 C언어 풀이 (0) | 2021.08.04 |
백준 3052번 C언어 풀이 (0) | 2021.08.04 |
백준 2562번 C언어 풀이 (0) | 2021.08.03 |