문제 링크 : https://www.acmicpc.net/problem/1946
문제 등급 : Silver I
 

1946번: 신입 사원

첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성

www.acmicpc.net

문제 해결 로직

  1. 서류 순위와 면접 순위 중 서류 순위를 기준으로 오름차순으로 정렬한다.
  2. 첫 번째 면접자는 서류 순위 중 1등이기 때문에 합격이다.
  3. 첫 번째 면접자의 면접 순위를 기준으로 면접 순위가 작은 면접자를 찾아 합격시킨다.
  4. 면접 순위가 작은 면접자를 기준으로 보다 작은 면접 순위를 가진 면접자를 합격시킨다.
  5. 4번을 반복하여 합격자의 수를 카운트한다.

이 문제의 핵심은 문제를 잘 읽고 해석하는 것이었다.

다른 지원자보다 떨어지지 않는 자만 선발한다는 원칙에서 많이 헷갈렸다.

처음에는 서류 순위 기준으로 정렬 후 바로 다음 지원자와 비교하여 합격을 판단하였다.

하지만 잘 못된 로직이었고 합격한 사람을 기준으로 더 나은 성적을 가진 지원자가 합격하는 것이었다.

구현 자체는 어렵지 않았으나 문제를 해석하는 게 어려웠다.

 

아래와 같이 소스를 공유드립니다.

public class 신입사원 {
    public static class Node {
        int g1, g2, sum;
        Node(int g1, int g2, int sum) {
            this.g1 = g1;
            this.g2 = g2;
            this.sum = sum;
        }
    }
    public static Comparator<Node> compare = new Comparator<>() {
        @Override
        public int compare(Node o1, Node o2) {
            return Integer.compare(o1.g1, o2.g1);
        }
    };
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int n = Integer.parseInt(br.readLine());

        for (int i = 0; i < n; i++) {
            int t = Integer.parseInt(br.readLine());
            List<Node> list = new ArrayList<>();
            for (int j = 0; j < t; j++) {
                StringTokenizer st = new StringTokenizer(br.readLine(), " ");
                int g1 = Integer.parseInt(st.nextToken());
                int g2 = Integer.parseInt(st.nextToken());
                list.add(new Node(g1, g2, g1+g2));
            }

            list.sort(compare);

            int cnt = 1;
            int c = list.get(0).g2;
            for (int j = 1; j < list.size(); j++) {
                if(c > list.get(j).g2) {
                    cnt++;
                    c = list.get(j).g2;
                }
            }

            sb.append(cnt).append("\n");
        }

        System.out.println(sb.toString());
    }
}
문제 링크 : https://www.acmicpc.net/problem/2217
문제 등급 : Silver IV
 

2217번: 로프

N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하

www.acmicpc.net

문제 해결 로직

  1. 로프의 길이를 오름 차순으로 나열하여 병렬로 세운다.
  2. 가장 작은 로프부터 for문을 돌면서 자기 자신의 길이만큼 남아 있는 루프에서 할당받아 병렬로 물건을 들어 올린다.
    1. 5, 4, 3, 2, 1의 로프가 있다.
    2. 1번의 로프를 활용하면 5개의 로프 모두 1만큼 사용할 수 있다. (1 * 5) = 5
    3. 2번의 로프를 활용하면 4개의 로프를 2만큼 사용할 수 있다. (2 * 4) = 8
    4. 3번의 로프를 활용하면 3개의 로프를 3만큼 사용할 수 있다. (3 * 3) = 9 
    5. 4번의 로프를 활용하면 2개의 로프를 4만큼 사용할 수 있다. (4 * 2) = 8
    6. 5번의 로프를 활용하면 1개의 로프를 5만큼 사용할 수 있다. (5 * 1) = 5
  3. 2번은 반복하면서 가장 큰 무게를 구한다.

 

아래와 같이 소스를 공유합니다.

public class 로프 {
    public static List<Integer> list = new ArrayList<>();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        for(int i = 0; i < n; i++) {
            int r = Integer.parseInt(br.readLine());
            list.add(r);
        }

        list.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1, o2);
            }
        });

        int max = Integer.MIN_VALUE;
        for (int i = 0; i < list.size(); i++) {
            int r = list.get(i);

            max = Math.max(max, r * (list.size() - i));
        }

        System.out.println(max);
    }
}
문제 링크 : https://www.acmicpc.net/problem/1541
문제 등급 : Silver II
 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net

문제 해결 로직

  1. 문자열을 '-' 기준으로 자른다.
  2. 자른 배열의 요소를 '+' 기준으로 자른다.
  3. +배열을 하나씩 더하고 - 를 한다.

이 문제는 +를 먼저 하고 -을 나중에 하여 큰 수를 빼주면 가장 작은 수를 구할 수 있는 문제이다.

 

아래와 같이 소스를 공유합니다.

public class 잃어버린 괄호 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] str = br.readLine().split("-");

        long res = Integer.MAX_VALUE;

        for(int i = 0; i < str.length; i++) {
            String[] s = str[i].split("\\+");
            
            long temp = 0;
            
            for(int j = 0; j < s.length; j++) {
                temp += Long.parseLong(s[j]);
            }
            
            if(res == Integer.MAX_VALUE) {
                res = temp;
            }else {
                res -= temp;
            }
        }

        System.out.println(res);
    }
}
문제 링크 : https://www.acmicpc.net/problem/1931
문제 등급 : Silver II
 

1931번: 회의실 배정

(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.

www.acmicpc.net

문제 해결 로직

  1. 회의가 끝나는 시간을 기준으로 내림 차순 정렬하고 끝나는 시간이 동일하다면 시작 시간을 오름차순으로 정렬한다.
  2. 정렬된 끝나는 시간으로 회의의 수만큼 반복하면서 정렬된 첫 회의 끝나는 시간보다 같거나 큰 시간의 회의 시작시간을 찾아 회의를 진행한다.
  3. 회의의 끝나는 시간보다 먼저 시작하는 회의는 다른 회의실을 사용해야 하므로 제외한다.
  4. 회의를 진행 할때 마다 회의의 진행 수를 Count 한다.

 

아래와 같이 소스를 공유합니다

public class 회의실배정 {
    public static class Node {
        int s, e;
        Node(int s, int e) {
            this.s = s;
            this.e = e;
        }
    }
    public static List<Node> times = new ArrayList<>();
    public static Comparator<Node> compare = new Comparator<Node>() {
        @Override
        public int compare(Node o1, Node o2) {
            return Integer.compare(o1.e, o2.e) == 0 ? Integer.compare(o1.s, o2.s) : Integer.compare(o1.e, o2.e);
        }
    };
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int s = Integer.parseInt(st.nextToken());
            int e = Integer.parseInt(st.nextToken());

            times.add(new Node(s, e));
        }

        times.sort(compare);

        Node node = times.get(0);

        int cnt = 1;
        for (int i = 1; i < times.size(); i++) {
            Node nextNode = times.get(i);
            if(node.e <= nextNode.s) {
                node = nextNode;
                cnt++;
            }
        }

        System.out.println(cnt);
    }
}

.

+ Recent posts