1. 문제

1484번: 다이어트



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