ALGORITHM/BOJ

[백준] 3649 로봇 프로젝트

0298 2021. 2. 18. 14:10

www.acmicpc.net/problem/3649

 

3649번: 로봇 프로젝트

각 테스트 케이스마다 한 줄에 하나씩, 구멍을 완벽하게 막을 수 있는 두 조각이 없다면 'danger'를 출력한다. 막을 수 있는 경우에는 'yes ℓ1 ℓ2'를 출력한다. (ℓ1 ≤ ℓ2) 정답이 여러 개인 경우에

www.acmicpc.net

2021-02-18


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
 
public class Main3649 {
    public static int N;
    public static long X, arr[];
    public static void main(String[] args) throws Exception {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String temp;
        while((temp = bf.readLine())!= null) {
            StringTokenizer st = new StringTokenizer(temp.trim());
            X = Long.parseLong(st.nextToken())*10000000// cm -> nano meter
            st = new StringTokenizer(bf.readLine().trim());
            N = Integer.parseInt(st.nextToken());
            arr = new long[N];
            for(int i = 0; i < N; i++) {
                st = new StringTokenizer(bf.readLine().trim());
                arr[i] = Long.parseLong(st.nextToken());
            }
 
            Arrays.sort(arr);
            boolean flag = false;
            if(N > 1) {
                int start = 0;
                int end = arr.length-1;
                while(start < end) {
                    if(X == arr[start] + arr[end]) {
                        System.out.println("yes " + arr[start] + " " + arr[end]);
                        flag = true;
                        break;
                    }
                    else if(arr[start] + arr[end] > X) end--;
                    else start++;
                }
            }
            if(!flag) System.out.println("danger");
        }
    }
}
cs

 

#문제풀이

1. 구하려는 블록의 길이 X는 나노미터로 환산을 해놓는다.

 

2. 레고조각들은 오름차순으로 정렬을 한다.

 

3. start는 첫 번째 인덱스 end값은 마지막 인덱스로 지정을 한 후, 현재 인덱스들의 값이 우리가 구하고자 하는 X의 경우 그대로 출력을 한 후 while문을 나왔다. 가장 끝과 끝에서부터 시작하기 때문에 무조건 |l1- l2|가 가장 클 것이다.

 

4. 만약 더한 값이 우리가 찾고자 하는 값이 아니라면, 값이 오버된 경우 end값을 땡기고, 값이 너무 적은 경우 start값을 올렸다.