ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ) 신입 사원
    알고리즘/백준 2020. 7. 18. 21:38
    반응형

    신입 사원

     

    1946번: 신입 사원

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

    www.acmicpc.net

    풀이

     

    처음에는 완전탐색으로 풀려고 시도했다.

    하지만, 모든 배열을 n번씩 돌다보니까 시간초과가 떴다.

    그래서 정렬을 이용해야 겠다고 생각했다.

     

    정렬의 기준을 잡는데 고민을 많이 했는데, 서류와 면접 둘 다 포함시켜 정렬하기엔 너무 복잡해서 하나를 기준으로 정렬을 해야겠다고 생각했다.

    그래서, 서류 심사를 기준으로 오름차순 정렬을 해줬다.

     

    서류 심사에서 1등을 받은 사람의 면접 등수를 첫 기준으로 삼고, 서류 2등부터 쭉 돌면서 면접 등수가 1등보다 높은 사람을 찾았다.

    면접 등수가 높은 사람은 서류에서 등수가 낮더라도 채용 기준에 부합하기 때문에 count+1을 해줬다.

    다음 탐색부터는 이 사람의 면접 등수를 기준으로 더 빠른 지원자를 찾아나갔다.

     

    코드 1

     

    통과는 했지만 메모리와 속도가 너무 심각했다.

    어떻게 할지 고민하다가, 어차피 서류를 기준으로 정렬을 할거면, 2차원 배열말고 1차원 배열로 선언하는 것이 좋다고 생각했다.

    서류 1등의 index는 1이 되게, 그리고 이 사람의 면접 등수가 value가 되게 배열을 저장했다.

    이렇게 되면, 정렬하는데 들어가는 비용을 많이 줄일 수 있다고 생각했다.

     

    코드 2

    메모리와 시간이 현저하게 준 것을 확인할 수 있었다.

     

     

    코드 1

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Arrays;
    import java.util.StringTokenizer;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            solution(new BufferedReader(new InputStreamReader(System.in)));
        }
    
        private static void solution(BufferedReader br) throws IOException {
            int testCase = Integer.parseInt(br.readLine());
            final String NEWLINE = "\n";
            StringBuffer sb = new StringBuffer();
            for(int i=0; i<testCase; i++) {
                int n = Integer.parseInt(br.readLine());
                int[][] participants = new int[n][2];
                for(int j=0; j<n; j++) {
                    StringTokenizer st = new StringTokenizer(br.readLine());
                    participants[j][0] = Integer.parseInt(st.nextToken());
                    participants[j][1] = Integer.parseInt(st.nextToken());
                }
                sb.append(getFreshMan(n,participants)).append(NEWLINE);
            }
            System.out.println(sb.toString());
        }
    
        private static int getFreshMan(int n, int[][] participants) {
            final int DOCUMENT =0, INTERVIEW =1;
            int result =1;
            Arrays.sort(participants, (int[] o1, int[] o2) -> o1[DOCUMENT] > o2[DOCUMENT] ? 1:-1); // 서류 심사 오름차순 정렬
            int min = participants[DOCUMENT][INTERVIEW];
            for(int i=1; i<n; i++) {
                if(min > participants[i][INTERVIEW]) {
                    result++;
                    min = participants[i][INTERVIEW];
                }  
            }
            return result;
        }
    }

     

    코드 2

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            solution(new BufferedReader(new InputStreamReader(System.in)));
        }
    
        private static void solution(BufferedReader br) throws IOException {
            int testCase = Integer.parseInt(br.readLine());
            final String NEWLINE = "\n";
            StringBuffer sb = new StringBuffer();
            for(int i=0; i<testCase; i++) {
                int n = Integer.parseInt(br.readLine());
                int[] participants = new int[n+1];
                for(int j=0; j<n; j++) {
                    StringTokenizer st = new StringTokenizer(br.readLine());
                    participants[Integer.parseInt(st.nextToken())] = Integer.parseInt(st.nextToken());
                }
                sb.append(getFreshMan(n,participants)).append(NEWLINE);
            }
            System.out.println(sb.toString());
        }
    
        private static int getFreshMan(int n, int[] participants) {
            final int FIRST =1;
            int result =FIRST;
            int min = participants[FIRST];
            for(int i=2; i<=n; i++) {
                if(min > participants[i]) {
                    result++;
                    min = participants[i];
                }  
            }
            return result;
        }
    }
    반응형

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

    BOJ) 동전 1  (0) 2020.07.18
    BOJ) 암호 만들기  (0) 2020.07.18
    BOJ) 적록색약  (0) 2020.07.16
    BOJ) 토마토  (0) 2020.07.16
    BOJ) 다리 놓기  (0) 2020.07.16

    댓글

Designed by Tistory.