ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1484 다이어트
    백준/두 포인터 2022. 6. 11. 21:38

    1. 풀이

     

    다른 블로그를 보고 문제를 풀었다.

     

    일단 이 문제는,

    A*A - B*B = G 를 만족하는 A를 찾는게 문제이다.

     

    문제의 예제에서는 G가 15이므로,

    4*4 - 1*1 = 15

    8*8 - 7*7 = 15 

    가 된다.

     

    1)  A의 범위

     

    그러면 A의 범위가 어느 정도일지 생각하는 게 중요하다.

     

    그러면 B를 1,2,3 으로 점점 증가시키면서 A 의 범위를 찾아보자.

     

    A*A - 1*1 = G   => A*A = 1+G

    A*A - 2*2 = G   => A*A = 4+G

     

    A*A - (A-1)*(A-1) = G => A*A = G+(A-1)*(A-1)

     

    즉, B가 커지면서 A가 점점 커지고,

    결국

    A가 가장 클 때는

    A*A = G+(A-1)*(A-1) 일 때이다.

     

    B가 A일 때는

    A*A - A*A = 0 이 된다.

    G가 자연수라고 했으므로 0이면 안된다.

     

    그래서 

    A*A - (A-1)*(A-1) = G 

    이 경우 A를 구해보면,

    A*A - A*A + 2*A -1 = G

    2*A = G+1

    A = (G+1) /2 이다.

     

    그런데, G가 100,000보다 작거나 같은 자연수라고 했으므로,

    A의 가장 큰 값을 찾으려면

    A = (100,000+1)/2 = 50,000.5 인데,

    A는 현재 몸무게를 나타내는 값으로, 자연수이어야 하므로

    50,000 까지 생각하면 된다.

     

    2) 두 포인터 사용

    일단 number 배열에 

    1*1 부터  50,000*50,000 까지  

    입력한다.

     

    그런 다음 

    start , end 두 가지 변수로 배열의 인덱스를 표시한다.

    start =1, end =2 로 시작한다.

     

    1.

    number[end] - number[start] = G 이면

    결과물로 출력하면 되고,

     

    2.

    number[end] - number[start] > G 이면

    start를 증가시키고

     

    3. 

    number[end]- number[start] < G 이면

    end를 증가시키면 된다.

     

    2. 최종 코드

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    
    public class Main {
    
    	public static void main(String[] args) throws IOException {
    		
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		
    		int G = Integer.parseInt(br.readLine());
    		int number[] = new int [50001];
    		
    		for(int i=1; i<=50000; i++) {
    			number[i] = i*i;
    		}
    
    		int start = 1;
    		int end = 2;
    		
    		ArrayList<Integer> result = new ArrayList<>();
    		
    		while(end<=50000) {
    			
    			if(number[end]- number[start]==G) {
    				result.add(end);
    				end++;
    			}else if(number[end]-number[start] <G) {
    				end++;
    			}else if(number[end] - number[start] >G) {
    				start++;
    			}
    			
    		}
    	
    			
    		if(result.size()==0) {
    			System.out.println(-1);
    			return;
    		}
    			
    			
    		for(int i=0; i<result.size(); i++) {
    				System.out.println(result.get(i));
    			}
    		
    	}
    }

     

     

    참고 블로그 :

    https://maivve.tistory.com/313

     

    (JAVA) 백준 1484번 : 다이어트 -- [투포인터]

    https://www.acmicpc.net/problem/1484 1484번: 다이어트 첫째 줄부터 한 줄에 하나씩 가능한 성원이의 현재 몸무게를 오름차순으로 출력한다. 가능한 몸무게가 없을 때는 -1을 출력한다. 현재 몸무게는 자연

    maivve.tistory.com

     

    '백준 > 두 포인터' 카테고리의 다른 글

    1806 부분합  (0) 2024.08.02
    3151 합이 0  (0) 2024.08.02
    2461 대표 선수  (0) 2022.05.15
    1253 좋다  (0) 2022.04.18

    댓글

Designed by Tistory.