관리 메뉴

찹모찌의 기록일지

단계별로 풀어보기 4단계: 1차원 배열 본문

알고리즘

단계별로 풀어보기 4단계: 1차원 배열

찹모찌 2022. 7. 28. 01:34

네 1차원 배열 단계를 풀어봤습니다.

언어로 C++를 사용했기 때문에 vector를 주로 사용해서 풀게 되었습니다.

기억에 남는 문제를 소개해드리도록 하겠습니다.

단계별로 풀어보기: 1차원 배열

 

  • 백준:2577 숫자의 개수

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

 

2577번: 숫자의 개수

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

www.acmicpc.net

2577번: 숫자의 개수

자연수 세 개를 곱한 값의 각 자리의 자연수의 개수를 세는 문제입니다. 여기서 중요한 점은 정수를 문자열로 변환하여 각 자리의 숫자를 카운팅하는 부분이 되겠네요.

여기서 처음에 itoa를 사용하여 숫자를 문자열로 변환하려고 했었습니다. 하지만 찾아보니 itoa는 비표준 함수라 실행이 안되었습니다.

따라서 sprintf문을 사용하여 변환해야 했습니다.

#include <iostream>
using namespace std;

int main(void)
{
    int a, b, c;
    char str[100];
    int count[10] = { 0, };
    scanf("%d", &a);
    scanf("%d", &b);
    scanf("%d", &c);
    int result = a * b * c;
    sprintf(str, "%d", result);
    for (int i = 0; str[i] != '\0'; i++)
    {
        count[str[i]-'0']++;
    }
    for (int i = 0; i < 10; i++)
    {
        printf("%d\n", count[i]);
    }
    return 0;
}

보면 문자열 str에 sprintf를 통해 정수 result의 값을 write해주는 모습입니다.

또한 count를 하기 위해 문자열의 위치, 즉 정수의 값을 찾을 때 '0'의 값을 빼주어 char 형을 int 형으로 변환하는 모습입니다.

새로운 방법들을 많이 알아가는 문제였습니다.

  • 백준: 4344 평균은 넘겠지

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

 

4344번: 평균은 넘겠지

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

www.acmicpc.net

1차원 배열 카테고리에서 제일 어려웠던 문제가 아닌가 싶습니다.

1차원 배열이라기보다는 2차원 배열에 가까웠던 문제라고 생각이 들긴 하는데, 아무튼 1차원 배열 문제라니 그렇다고 합시다.

예제 입력에서 알 수 있다시피 첫 줄에 입력 받을 반의 개수, 둘째 줄부터 인원수, 각 인원에 해당하는 점수로 되어있는데 

각 배열의 첫 항목이 인원 수가 된다는 점을 기억하고 있어야 한다.

그 뒤 부터는 각 반의 평균, 평균을 넘는 학생의 수, 비율 등을 계산하여야 하므로 복잡한 문제라고 볼 수 있다.

#include <iostream>
#include <vector>
using namespace std;

int main(void)
{
    int n;
    scanf("%d", &n);
    vector<vector<int>> v;
    vector<int> average;
    float avg;
    float per;
    int nn;
    int nnn;
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &nn);
        vector<int> vv;
        vv.push_back(nn);
        int sum = 0;
        for (int j = 0; j < nn; j++)
        {
            scanf("%d", &nnn);
            vv.push_back(nnn);
            sum += nnn;
        }
        avg = sum / vv[0];
        average.push_back(avg);
        v.push_back(vv);
    }
    int count = 0;
    for (int i = 0; i < average.size(); i++)
    {
        for (int j = 1; j < v[i].size(); j++)
        {
            if (average[i] < v[i][j])
                count++;
        }
        printf("%.3f%%\n", (float)((float)count*100 / (float)v[i][0]));
        count = 0;
    }
    return 0;
}

코드 길이에서 알 수 있듯 복잡한 문제였습니다. 정답을 내는 과정에서 float로 변환을 해줘야 정답이 나올 수 있어 더욱 귀찮았던 문제였습니다.

 

1차원 배열까지 풀며 슬슬 머리가 아파지기 시작했습니다.

다음이 기대가 되네요.