ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [KOITP] 지은이가 지은 집
    자료구조 및 알고리즘/문제풀이 2016. 12. 19. 09:35

        처 : http://koitp.org/problem/ICPC_2012NWERC_HOUSE/read/



    시간 제한메모리 제한제출 횟수정답 횟수 (비율)정답자 수
    2.0 초512 MB3611433 (12%)325

    문제

    최근에 지은이는 건축에 관심이 많아 집을 짓게 되었다. 태양이는 지은이가 지은 집에 놀러갔다. 근데 아니나 다를까 집에 작은 구멍이 있는 것이다. 지은이와 태양이는 집을 보수하기로 했다.

    다행히도 지은이가 집을 짓다가 남은 재료가 남아서, 이를 이용하여 집을 보수하기로 했다. 구멍이 난 곳의 너비는 x센티미터이다. 태양이와 지은이는 사이가 너무 좋아서, 남은 재료 중 하나씩 골라서 이어 붙이고, 이로 구멍을 막기로 했다. 즉, 태양이과 지은이가 고른 재료의 길이가 L1, L2이면, L1+L2가 x와 같아야 구멍을 막을 수 있다. 크기가 다르면, 또 망가질 위험이 있기 때문이다.

    그럼 이제 구멍을 완벽하게 막을 수 있는 두 막대를 구하는 프로그램을 작성하시오.

    입력

    첫 번째 줄에 구멍의 너비 X가 주어진다. X의 단위는 센티미터이다.

    두 번째 줄에 재료의 개수 N이 주어진다. (0 ≤ N ≤ 1,000,000)

    세 번째 줄부터 N개의 줄에 걸쳐 각 재료의 길아 Li가 주어진다. Li의 단위는 나노미터이다. (1 ≤ Li ≤ 100,000,000, 1cm = 10,000,000nm)

    출력

    첫 번째 줄에 구멍을 완벽하게 막을 수 있는 두 조각이 없다면 'danger'(따옴표 제외)를 줄력한다. 만약, 완벽하게 막을 수 있는 경우 'yes L1 L2'를 출력한다. (L1 ≤ L2). 정답이 여러 개인 경우에는 |L1 - L2|가 가장 큰 것을 출력한다.

    힌트

    예제 입력

    1
    4
    9999998
    1
    2
    9999999
    

    예제 출력

    yes 1 9999999



    < Comment >

     문제를 전에 잠깐 본 적이 있기도 한 터라 어렵지 않게 풀 수 있었습니다. 다만 N의 범위가 0 부터인데, 이 경우에도 danger를 출력해주어야 합니다. 이 부분에 대한 처리를 안 했던 터라 Exception 이 발생했었습니다.



    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.util.Arrays;
    
    public class Jienii {
    	
    	public static int cm = 10000000;
    	public static int N = 0;
    	
    	public static int arr[] = null;
    	
    	public static void main(String[] args) throws Exception {
    		
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    		
    		int xlen = Integer.parseInt(br.readLine());
    		int x = cm * xlen;
    		
    		N = Integer.parseInt(br.readLine());
    		arr = new int[N];
    		for (int i = 0 ; i < N ; i++) {
    			arr[i] = Integer.parseInt(br.readLine());
    		}
    		
    		if (N == 0) {
    			bw.write("danger");
    			bw.flush();
    		} else {
    			Arrays.sort(arr);
    			
    			int head = 0;
    			int tail = arr.length - 1;
    			
    			while (head != tail) {
    				
    				int nowSum = arr[head] + arr[tail];
    				
    				if (nowSum == x) {
    					bw.write("yes " + arr[head] + " " + arr[tail]);
    					bw.flush();	
    					break;
    				} else if (nowSum < x) {
    					head++;
    				} else if (nowSum > x) {
    					tail--;
    				}
    			}
    			
    			if (head == tail) {
    				bw.write("danger");
    				bw.flush();
    			}
    		}
    		
    		bw.close();
    	}
    
    }
    


    댓글

Designed by Tistory.