[백준] 1484 - 다이어트
1. 문제
2. 개요
G가 주어진다.
G는 현재 몸무게의 제곱 - 기억하고 있던 원래 몸무게의 제곱이다.
G는 100000 이하의 자연수이다.
이 때 현재 몸무게로 가능한 모든 수를 출력하는 문제. 가능한 게 없다면 -1를 출력한다.
3. 풀이 및 코드
3-1. 풀이
[C# 코드를 기준으로 작성]
원래 몸무게를 l, 현재 몸무게를 r로 잡는다.
G가 자연수이기 때문에 원래 몸무게와 현재 몸무게는 0 < l < r 를 만족한다.
따라서 l = 1, r = 2를 초기값으로 잡고 시작한다.
r^2 - l^2 < G 라면 r을 늘려주고, r^2 - l^2 > G라면 l을 늘려가며 값을 찾는다.
만약 r^2 - l^2 == G 라면 둘 다 값을 늘려준다.
이를 l == r이 될 때 까지 반복하여 값을 찾아 출력한다.
만족하는 값이 없었다면 -1을 출력한다.
3-2. Python
import sys
N = int(sys.stdin.readline())
squares = [0]
num = 1
while num ** 2 - squares[-1] <= N:
squares.append(num ** 2)
num += 1
l, r = 1, 2
answers = []
while r < len(squares):
if squares[r] - squares[l] < N:
r += 1
elif squares[r] - squares[l] > N:
l += 1
else:
answers.append(r)
r += 1
l += 1
if answers:
for ans in answers:
print(ans)
else:
print(-1)
3-3. C#
namespace boj_1484
{
internal class Program
{
static void Main(string[] args)
{
int N = int.Parse(Console.ReadLine());
long l = 1;
long r = 2;
bool answerexist = false;
while (r * r - ((r - 1) * (r - 1)) <= N)
{
if (r * r - l * l < N)
r++;
else if (r * r - l * l > N)
l++;
else
{
Console.WriteLine(r);
r++;
l++;
if (answerexist == false)
answerexist = true;
}
}
if (answerexist == false)
Console.WriteLine(-1);
}
}
}
Comments