[백준] 1484번_다이어트 C++


수학 공식과 투 포인터를 사용하는 문제.

정답제출코드


#include <iostream>
#include <vector>

#define MAX 100000

using namespace std;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    vector<int> ans;

    int G;
    cin >> G;

    int L = 1, H = 1;
    while (L <= MAX && H <= MAX)
    {   
        int tmp = (H+L) * (H-L);

        if (tmp == G)
            ans.push_back(H);

        if (tmp < G)
            H++;
        else
            L++;
    }

    if (ans.size() == 0)
        cout << -1;
    else
    {
        for (size_t i = 0; i < ans.size(); ++i)
            cout << ans[i] << '\n';
    }


    return 0;
}

우선, 현재 몸무게를 H, 이전 몸무게를 L이라고 하자.

여기서 현재 몸무게의 제곱 - 이전 몸무게의 제곱 값은

(현재 몸무게 + 이전 몸무게) * (현재 몸무게 - 이전 몸무게)의 값과 같다.

그래서 코드에 tmp = (H+L) * (H-L) 값을 넣어주었다.

또한, 최대 값이 100000이므로 MAX로 정의하여

두 값이 모두 100000이하일 때에만 루프문을 돌도록 구현하였다.

이렇게 투 포인터를 사용해서 계산을 해주며 맞는 값이 나오면 벡터에 저장하도록 했다.

처음엔 이중 for문을 사용할 생각을 했지만 시간초과가 날 것 같아서

투 포인터를 사용하였다.


© 2022.07. by Wookey_Kim

Powered by Hydejack v7.5.2