1 분 소요

다이어트 (백준 Gold 5)

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

특정한 수치 g가 주어졌을때

a^2 - b^2 = g가 성립한다
(단 g는 자연수)

a로서 가능한 수를 오름차순으로 출력하는 문제

  • 출력이 불가능한 경우는 -1 출력

풀이 방법

투 포인터 문제

위 방정식을 전개하면
(a + b)(a - b) = g 가 된다

  • b는 a보다 작아야 함
  • 또한 몸무게 자체는 0보다 커야 한다

따라서

  • a : 2, b : 1 에서 시작
  • 해당 공식에 집어넣어 g와 같으면 a 값을 기록
    • g보다 작다면 a 증가 (값을 크게 해야 함)
    • g보다 크다면 b 증가 (값을 작게 해야 함)

제출 코드

#include<iostream>
#include<vector>

using namespace std;

int GetValue(int a, int b)
{
	return (a + b) * (a - b);
}

int main()
{
	int g;
	cin >> g;

	int t1 = 2; // a
	int t2 = 1; // b
	vector<int> v;

	while (t1 > t2)
	{
		int vv = GetValue(t1, t2);
		if (vv == g)
		{
			v.push_back(t1);
			t1++;
			t2++;
			continue;
		}

		if (vv > g)
		{
			t2++;
		}
		else
		{
			t1++;
		}
	}

	if (v.size() > 0)
	{
		for (int i : v)
		{
			cout << i << '\n';
		}
	}
	else
	{
		cout << -1;
	}

	return 0;
}

결과

Image

백준 표기 난이도에 비하여
수학적인 접근과 투 포인터에 대한 이해도를 요구하는 문제였다

댓글남기기