[백준] 2577번 - 숫자의 개수


문제

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

세 개의 자연수를 입력받고 세 숫자의 곱의 각 자리를 쪼개기만 하면 되는 문제이다. 세 숫자의 곱을 어떻게 저장해야 표현하기 쉬울까를 고민하던 와중 배열을 선택하였다.
배열에 한자리씩 저장한다면, 인덱스 배열을 만들어서 카운트를 올려주기만 하면 해결되기 때문이다. 세 숫자의 곱을 배열에 저장하는 방법으로는 sprintf라는 함수를 사용하였다. 이 함수는 printf에서 화면에 출력하는 대신, 화면에 출력할 문자열을 인자로 지정한 문자열에 쓰는 것이다. 이 때 주의할 점으로는, 인자로 지정한 배열의 크기배열에 쓰여질 문자열의 크기 보다 커야만 하며 배열의 맨 마지막에 NULL 문자를 붙이기 때문에 항상 한 칸이상의 여유가 있어야 한다. 정수 형태의 문자열로 데이터가 저장되었기 때문에 인덱스 배열의 인덱스 값으로 쓰려면 정수형 데이터로 바꿔주어야 한다. 이는 (문자형데이터 - ‘0’)로 해결할 수 있다. ‘0’에 해당하는 아스키코드를 정수 형태의 문자열에서 빼줌으로써 정수형 데이터로 바꾸어주는 원리이다. 이를 코드로 표현하면 아래와 같다.
cf) ‘0’의 아스키코드는 48이며 정수 형태의 문자 ‘9’까지 1씩 증가한다.

다른 방법으로는, 모듈로를 이용하여 한자릿수씩 분할한 다음에 인덱스 배열에 저장하는 방식이다. 이는 매우 간단하면서도 기본적으로 알아야 하는 로직이다. 임의의 양의 정수를 자릿수로 분할할 일은 많기 때문에 꼭 알아두자.임의의 양의 정수를 10으로 나눈 나머지는 항상 일의 자리의 수이다. 그렇기에 임의의 양의 정수가 0이 되기 전까지 10으로 나눠가면서 10으로 나눈 나머지를 저장해주면 된다. 이를 코드로 표현하면 아래와 같다.