[백준] 2572번
이 문제는 배열을 이용하여 푸는 방식이 있습니다.
문제에서 보시다시피 A*B*C의 값 안에 각 숫자가 몇 개 포함되어 있는지 확인하고 출력하는 문제입니다.
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
void getAnswer(vector<int> &arr, long value){
//value의 값을 10으로 나눈 나머지의 인덱스 값을 1씩 추가하고 value값을 10으로 나누는걸 반복하는 과정
while(value!=0){
arr[value%10]++;
value/=10;
}
}
int main(){
int A,B,C;
// 0~9까지의 인덱스 값이 저장된 배열 선언
vector<int> arr(10);
scanf("%d",&A);
scanf("%d",&B);
scanf("%d",&C);
getAnswer(arr,A*B*C);
int i=0;
for(i=0;i<10;i++){
printf("%d\n",arr[i]);
}
return 0;
}
우선해야 할 것은 A*B*C의 값의 각 숫자는 어차피 0~9까지의 숫자밖에 없다는 점을 인지하셔야 합니다.
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
arr[0] | arr[1] | arr[2] | arr[3] | arr[4] | arr[5] | arr[6] | arr[7] | arr[8] | arr[9] |
제일 처음 arr벡터를 선언하면 위와 같은 형식이 됩니다.
문제에서 나온 예시를 보자면 A*B*C의 값=17037300 와 arr 배열이 getAnswer의 인자값으로 전달 됩니다. 전달할 때 arr의 배열의 값이 바뀔 것이기 때문에 참조값으로 넘겨줬습니다.
getAnswer 함수는 반복문을 이용해서 넘긴 value값이 0이 아닐때까지 나누고 arr배열의 인덱스 값을 +1씩 하는 알고리즘입니다. 예를 들어 설명하자면,
초기 값은 17037300이므로
17037300%10=0 이므로 -> arr[0]번째에 있는 값을 +1 하고 즉 arr[0]=1 이 되는겁니다.
17037300/10=1703730 -> value 값을 10으로 나누는 과정을 반복하는 것입니다.
1703730%10=0 이므로 -> arr[0]번째에 있는 값을 +1 하고 나서, 즉 arr[0]=2가 되는 것입니다.
1703730/10=170373 -> value 값을 10으로 나누는 과정을 반복하는 것입니다.
170373%10=3 이므로 -> arr[3]번째에 있는 값을 +1 하고 나서, 즉 arr[3]=1가 되는 것입니다.
170373/10=17037 -> value 값을 10으로 나누는 과정을 반복하는 것입니다.
위와 같은 연산을 반복하면 value 값은 결국 0이 될 것이고 반복문이 종료되면서 arr배열의 값은 업데이트가 되어 있습니다.
끝으로 arr 값을 출력해주면 됩니다.
감사합니다.
'개발자 > C or C++' 카테고리의 다른 글
[백준] 2557번 (0) | 2021.10.03 |
---|---|
[백준] 3052번 (0) | 2021.10.03 |
[백준] 2562번 (0) | 2021.10.02 |
[백준] 10818번 (0) | 2021.10.02 |
[백준] 2217번 (0) | 2021.10.02 |
댓글