개발자/C or C++

[백준] 2572번

Mosser 2021. 10. 3.
728x90
반응형

이 문제는 배열을 이용하여 푸는 방식이 있습니다.

문제에서 보시다시피 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

댓글