본문 바로가기
Problem Solving/백준

백준 1484 : 다이어트

by Libi 2021. 8. 8.
반응형

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

 

1484번: 다이어트

첫째 줄부터 한 줄에 하나씩 가능한 성원이의 현재 몸무게를 오름차순으로 출력한다. 가능한 몸무게가 없을 때는 -1을 출력한다. 현재 몸무게는 자연수로 떨어지지 않을 수도 있는데, 이런 경우

www.acmicpc.net

[ 문제풀이 ]

수학적으로 접근하면 쉽게 해결할 수 있는 문제이다.현재 몸무게를 x, 기억하고 있던 몸무게를 y로 둔다면 다음과 같이 표현할 수 있다.

G = x^2 - y^2

이를 풀어보면 다음과 같으며 결국 (x+y)와 (x-y)는 G의 약수여야 한다는 것을 알 수 있다.

G = (x+y)(x-y)

따라서 루트 G부터 1까지 차례대로 탐색해주면서 G의 약수를 찾아주면 된다.

주의해야 할 점은 우리가 구하고자 하는 값은 x이기 때문에 (x+y)와 (x-y)를 +하여 2x를 구한 후 2로 나눌 것이다. 이때 몸무게는 자연수여야 한다는 조건이 있기 때문에 더해준 값이 짝수여야 한다.

또한, 몸무게는 자연수이기 때문에 0이 될 수 없다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
	
	public static void main(String[] args) {
		try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
				BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))) {
			int G = Integer.parseInt(br.readLine());
			boolean find = false;
			//G = x^2 - y^2 = (x + y)(x - y)
			//x + y = G/k, x - y = k
			//x = (G/k + k)/2, y = (G/k - k)/2
			for (int k = (int) Math.sqrt(G); k >= 1; --k) {
				if (G % k != 0) continue;
				int v = G / k;
				if ((v + k) % 2 != 0 || (v - k) / 2 == 0) continue;
				find = true;
				bw.write((v + k) / 2 + "\n");
			}	
			if (!find) bw.write("-1\n");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

 

반응형

'Problem Solving > 백준' 카테고리의 다른 글

백준 7453 : 합이 0인 네 정수  (0) 2021.08.10
백준 16434 : 드래곤 앤 던전  (0) 2021.08.09
백준 1647 : 도시 분할 계획  (0) 2021.08.07
백준 1013 : Contact  (0) 2021.08.05
백준 10159 : 저울  (0) 2021.08.04

댓글