ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [삽입정렬] 백준 11399번
    책/DoIt 알고리즘 코딩테스트 2024. 11. 10. 16:22

    문제

    1. ATM 기 한 개가 있고, 손님들이 각자 업무를 보는 시간이 주어진다
    2. 모든 손님들의 서비스를 합한 시간의 최소값을 구해라
    (사람의 수  : 1 <=  N <= 1,000)
    (사람 당 서비스 시간 :  1 <= P <= 1,000)
    * 시간제한 : 1초

     

    문제분석

    1. 가장 빠른 시간에 인출하는 방법을 그리디 방식이라고 한다.
    2. 시간제한은 1초 이므로, O(N^2) 이하인 정렬 알고리즘 아무거나 사용하면 된다
    3. 정렬 이후 서비스 시간을 합정렬을 이용하여, 최소값 구함
    그리디 방식?
     - 그리디 방식이란 탐욕법으로서 가장 최적의 해를 구하는 것을 목표하는 알고리즘이다.
     - 현재 문제에서는, 앞에 있는 손님들의 서비스 시간을 더해야하므로 반복적으로 더해지는 서비스 시간이 적어야한다
     - 따라서, 그리디 방식을 적용하여 서비스 시간의 최적의 해를 도출해야한다

     

    슈도코드

    N (사람 수)
    A (공백으로 구분된 사람 당 서비스 시간)
    for( A 크기 ){
        arr(A배열 저장)
    }
    
    for(i : N만큼 반복){
        for( 정렬된 범위 ){
            삽입할 위치 찾기
        }
        
        shift(정렬된 범위에 삽입할 위치에 삽입하기)
    }
    
    for( arr 배열 ){
        for( 합정렬 ){
            최소값 구하기;
        }
    }
    
    출력

     

     

    구현하기

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main {
        public static void main(String[] args) throws Exception {
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            Integer size = Integer.parseInt(bf.readLine());
            
            StringTokenizer st = new StringTokenizer(bf.readLine());
            int []arr = new int[size];
            
            for (int i =0; i< size; i++){
                arr[i] = Integer.parseInt(st.nextToken());
            }
            
            for (int i = 1; i< arr.length; i++){
                int insertIndex = i;
                for (int j = i - 1; j >= 0; j--){
                    if( arr[j] >= arr[i] ){
                        insertIndex = j;
                    }
                }
    
                shift(arr, insertIndex, i);
            }
         
            int min = 0;
            for (int i =0; i< arr.length; i++) {
                for (int j = 0; j <= i; j++){
                    min += arr[j];
                }
            }
    
            System.out.println(max);
        }
    
        private static void shift(int[] arr, int insertIndex, int endIndex){
            int temp = arr[endIndex];
    
            for (int i = endIndex; i > insertIndex; i--){
                arr[i] = arr[i-1];
            }
    
            arr[insertIndex] = temp;
        }
    
    
        
    
    }

    ' > DoIt 알고리즘 코딩테스트' 카테고리의 다른 글

    [병합 정렬] 백준 2751번  (0) 2024.11.12
    [퀵 정렬] 백준 11004번  (0) 2024.11.12
    [선택정렬] 백준 1427번  (1) 2024.11.09
    [버블정렬] 백준 1377번  (0) 2024.11.08
    [버블정렬] 백준 2750번  (0) 2024.11.07
Designed by Tistory.