ABOUT ME

Today
Yesterday
Total
  • 1744 수 묶기
    백준/그리디 알고리즘 2024. 7. 22. 21:50

     

    입력값에서 음수랑, 양수를 따로 받는다. 

     

    예를 들어 

    -10 -5 -1 0 1 2 3 4 5 

     

    이런식으로 입력값이 있을 때

    1) 양수는 양수 리스트에 담고, 내림차순 정렬

    -> 5 4 3 2 1

     

    2) 음수와 0은 음수리스트에 담고, 오름차순 정렬

    -10 -5 -1 0

     

    그런 다음에 맨 처음에 있는 값부터 다음수와 묶으면 된다.

     

    즉 양수의 경우 

    -> 5 4 3 2 1

    5*4 + 3*2 + 1 = 20 + 6 + 1 = 27 

    이 최대의 값이 되고,

     

    음수의 경우

    -10 -5 -1 0

    (-10) * (-5) + (-1)*0 = 50 + 0 = 50 

    이 최대의 값이 된다. 

     

    0을 음수 리스트에 넣은 이유는,

    음수가 홀수개 있을 경우 나머지 1개는 수를 묶을 수 없어서

    음수 그대로 남게 되는데, 0을 곱해서 0으로 만들면 음수를 없앨 수 있다.

     

    그리고 1의 경우는,

    그냥 더하는 것이 최댓값을 만들 수 있다.

    즉, 1 1이 있을 경우,

    수를 묶으면 1*1 = 1 밖에 안 되지만,

    묶지 않으면, 1+1=2 가 된다.

     

    그래서 이 경우는 예외 처리해주면 된다. 

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.StringTokenizer;
    
    
    public class Main {	
    	
    	public static void main(String[] args) throws IOException {
    		
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
    		StringTokenizer st = new StringTokenizer(br.readLine(), " " );
    		int N = Integer.parseInt(st.nextToken());
    		
    		ArrayList<Integer> positive_number = new ArrayList<>();
    		ArrayList<Integer> negative_number = new ArrayList<>();
    		
    		for(int i=0; i<N; i++) {
    			st = new StringTokenizer(br.readLine(), " " );
    			int number = Integer.parseInt(st.nextToken());
    			
    			if(number>0) {
    				positive_number.add(number);
    			}else {
    				negative_number.add(number);
    			}
    		}
    		
    	
    		// 내림차순
    		Collections.sort(positive_number, Collections.reverseOrder());
    		
    		// 오름차순 
    		Collections.sort(negative_number);
    		
    		
    		int result = 0;		
    		int i = 0;
    		int size = positive_number.size();
    		
    		while(i<size) {
    		
    				if(i<size && i+1<size) {
    				
    					int a= positive_number.get(i);
    					int b= positive_number.get(i+1);
    						
    					
    					if(a==1||b==1) {
    						result+=a;
    						result+=b;
    					}else {
    				
    						result+=a*b;
    					}
    					
    				}else {
    					int a= positive_number.get(i);
    					result+=a;
    				}
    				i+=2;	
    				
    			 }
    		
    		
    		
    		i=0;
    		size = negative_number.size();
    		while(i<size) {
    			
    			if(i<size && i+1<size) {
    			
    				int a= negative_number.get(i);
    				int b= negative_number.get(i+1);
    	
    				result+=a*b;
    			}else {
    				int a= negative_number.get(i);
    				result+=a;
    			}
    			i+=2;
    			
    		 }
    		
    		
    		System.out.println(result);
    		}
    }

     

    '백준 > 그리디 알고리즘' 카테고리의 다른 글

    1781 컵라면  (0) 2024.07.05
    12904 A와 B  (0) 2022.05.02
    2872 우리집엔 도서관이 있어  (0) 2022.05.02
    2839 설탕 배달  (0) 2022.03.10
    2437 저울(자바)  (0) 2022.02.19

    댓글

Designed by Tistory.