백준 알고리즘/입문&기본 (브론즈)

백준 입문 문제추천 2577(C언어 풀이 및 응용)

공대 개구리 2022. 8. 15. 23:42
반응형

내가 C로 코딩을 공부하는 이유는 임베디드 프로그래밍을 위해서다.

나중에 언어에 대한 이해 + 알고리즘에 대한 익숙함을 학습 결과물로 얻고싶다.

 

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

 

2577번: 숫자의 개수

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.

www.acmicpc.net

 

 

첫번쨰로 성공한 코드 ( 2시간 넘게 걸렸다.)

#include <iostream>
#include <math.h>

int main() {

    int arr[10]={0}; // 맥시멈이 9자리다.
    int A,B,C,D;
    scanf("%d %d %d",&A,&B,&C);
    D = A*B*C;

    // 17037300
    for(int i=0; i<10; i++)
    {
        int count;
        count = 0; // 매번 0으로 둔다
        double E =  pow(10,(i+1)); //10 100 1000 10000.00
        double F =  pow(10,i); // 1.00 10.00 100.00
        int G = E; // 정수형으로 변환
        int H = F; // 정수형으로 변환
        int P = D%G; // 연산순서를 위해서
        
        count = P/H; // 해당자리의 숫자를 찾기 위함
        arr[count]= arr[count]+1; // 그것을 맞는 칸에 넣어서 +1
        D = D-P; // P/H는 500을 5로 만든거고, D-P를 해줘야 숫자가 넘어감 

        if(D==0)
            break; 
    }
    for(int i=0; i<10; i++)
    {
        printf("%d\n",arr[i]);
    }
}

 

코딩을 처음 입문하는 사람들이 풀기 좋은 문제는 아니었다.

잘 몰라도 찾아보면서 풀면, 여러 개념을 가져갈 수 있는 문제였다.

배열에 관해서, ^ 연산자는 XOR을 의미한다는 것, pow 함수, 자료형, 자리수(degit) 를 생각하기 좋았다.


문제를 풀기 위해서 공부한 것들

 

pow 함수, 배열, 자료형, 자리에 있는 숫자 쉽게 계산하기

 

0. 애초에 pow 함수를 사용하지 않고도 풀 수 있었던 문제이다.

내가 이런 문제를 여러번 풀어봤다면 쉬웠겠지.

[자리수 응용에 대해서]

while (D > 0) {
    int count = D % 10;
    frequency[count]++;
    D /= 10;
}

이런 간단한 방법으로 자리에 대한 것을 표현할 수 있다.

 

1. C#, C언어에서 ^ 연산자는 XOR을 의미한다.

 

2. 우리가 흔히 사용하는 제곱연산자는 pow(x, y); 이다. 반환도 double로 된다.

ex) 5^3 을 계산하기 원한다면 pow(5,3); 단, 125.00000 의 형태로 나오니까 정수형으로 쓰고싶다면

int 를 하나 더 사용하여서 자료형을 변환해주면 된다. ( 나는 그렇게 하였다. ) 

 

3

int arr[3] = {0, }  3칸짜리 배열을 모든 값을 0으로 초기화해준다.

arr[3] = 2;  2번째 칸에 숫자 2가 들어간다는 뜻

 

두번쨰로 사용한 코드 (현업자인 친구가 공부하라고 준 코드)

#include <stdio.h>
#include <iostream>
#include <math.h>

int main() {

    int A, B, C;
    scanf("%d %d %d", &A, &B, &C);
    int D = A * B * C;
    int frequency[10] = {0,};

    while (D > 0) {
        int count = D % 10;
        frequency[count]++;
        D /= 10;
    }

    for (int i = 0; i < 10; i++) {
        printf("%d\n", frequency[i]);
    }
}