코딩 테스트/C++

백준, C++) 2798, 2231, 19532

나무늘보섬 2025. 10. 1. 18:02

2798

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

for문 3회로 풀었음. 입력 크기가 그렇게 크지 않아 시간 복잡도 측면에서 무리없이 작동함

INF의 경우, 맨 위에 #define INF 1000000이라고 정의해서 큰 값을 표현

더보기
void p2798()
{
    // 3 <=n <= 100, 10<=m<=300,000
    // n장의 카드, M을 넘지 않으면서 최대한 가까운 수.
    // 각 카드는 100,000을 넘지 않음.
    int n, m;
    int diff = INF;
    int res;
    cin >> n >> m;
    vector<int> nums;
    nums.resize(n);
    for (int i = 0; i < n; i++)
    {
        int k = 0;
        cin >> k;
        nums[i] = k;
    }

    for (int i = 0; i < n - 2; i++)
    {
        for (int j = i + 1; j < n - 1; j++)
        {
            for (int k = j + 1; k < n; k++)
            {
                int val = nums[i] + nums[j] + nums[k];
                if (m >= val && ((m - val) < diff))
                {
                    diff = m - val;
                    res = val;
                }
            }
        }
    }

    cout << res;
}

 


2231

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

문자열을 int로 변형 후 풀이, char to int를 -'0'을 통해 변경 (아스키코드)

res는 0으로 초기화해서 없는 경우, 바로 0으로 출력되도록.

이중 for문이어서 시간 복잡도 측면의 에러를 걱정했으나 통과

더보기
void p2231()
{
    // 분해합
    // 256 = 245 +2 + 4 + 5
    // 따라서 245는 256의 생성자가 됨.
    // 생성자는 여러 개가 될 수 있음. -> 가장 작은 생성자
    // 자연수 N을 입력받음 (1<=N<=1,000,000)
    // 만약 생성자가 없다면 0을 출력

    string s;
    cin >> s;
    int res = 0;
    int num = stoi(s);  // int 변환
    for (int i = 1; i < num; i++)
    {
        int val = i;
        string tmps = to_string(i);
        int temp = tmps.size(); // 몇 자리 수인지 체크
        for (int j = 0; j < temp; j++)
        {
            val += (tmps[j] - '0');
        }
        if (num == val)
        {
            res = i;
            break;
        }
    }
    cout << res;
}

 

 

 


19532

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

해가 유일하다고 했으므로, 일반적으로 연립방정식 풀듯이 풀이

계수가 0인 경우 처리를 안해줬더니  47%? 쯤에서 에러가 나와서 다시 수정

더보기
void p19532()
{
    // ax + by = c
    // dx + ey = f

    // adx + bdy = cd
    // adx + aey = af

    // 1) 모두 0인 경우

    // 2) a가 0인 경우
    //    d가 0인 경우

    // 3) b가 0인 경우
    //    e가 0인 경우

    // 4) 모든 게 0이 아닌 경우
    // result;
    int x = 0, y = 0;
    int a, b, c, d, e, f;
    cin >> a >> b >> c >> d >> e >> f;

    // 1)
    if ((a == 0 && b == 0) || (d == 0 && e == 0))
    {
        cout << x << " " << y; // 둘 다 0으로 출력
        // return 0;
    }
    // 2)
    else if (a == 0)
    {
        y = c / b;
        x = (f - e * y) / d;
    }
    else if (d == 0)
    {
        y = f / e;
        x = (c - b * y) / a;
    }
    // 3)
    else if (b == 0)
    {
        x = c / a;
        y = (f - d * x) / e;
    }
    else if (e == 0)
    {
        x = f / d;
        y = (c - a * x) / b;
    }
    //  4) 모든 계수가 0이 아닌 경우
    else
    {
        y = (c * d - a * f) / (b * d - a * e);
        x = (c - b * y) / a;
    }

    cout << x << " " << y;
}