문제: 1484번: 다이어트
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <limits>
#include <queue>
#include <stack>
#include <string>
//#include <bits/stdc++.h>
using namespace std;
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
int g; // 현재 몸무게 제곱 - 기억 몸무게 제곱
cin >> g;
long long st = 1;
long long en = 2;
bool found = false;
priority_queue<int, vector<int>, greater<int>> weights;
while (en <= 100000) {
long long tmp = (en * en) - (st * st);
if (tmp < g) {
// 현재를 키워야죵
en++;
}
else if (tmp > g) {
// 기억을 키워야종
st++;
}
else {
// 만약 tmp 가 g 랑 같아? 그럼 이제 현재를 키워야징
cout << en << "\n";
found = true;
en++;
}
}
if (!found) {
cout << -1 << "\n";
}
return 0;
}
st 를 기억 몸무게로 놓고, en 을 현재 몸무게로 놓은 다음에 투포인터 개념을 이용해서 풀었다.
tmp 의 값은 현재 몸무게를 제곱한 값에 기억 몸무게를 제곱한 값을 뺀 값이다. 만약 이 값이 문제에서 주어진 g 값과 같다면 당시 현재 몸무게를 출력해주면 된다. 그 후 현재 몸무게를 +1 해준다.
그런데 만약 g 값보다 작다면? 이는 현재 몸무게를 키워야 한다는 의미이므로 얘도 +1 해준다.
만약 g 값보다 크다면 얘는 기억 몸무게를 키워야 한다는 의미이므로 그억 몸무게를 +1 해준다.
while 문의 조건문을 보면 en 의 값이 100000 보다 작거나 같을 때까지로 반복 종료 조건을 줬다.