본문 바로가기

CT

[BOJ] 24단계 그리디 알고리즘

1 11047 동전 0
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String[] split = reader.readLine().split(" ");
        int N = Integer.parseInt(split[0]);
        int K = Integer.parseInt(split[1]);
        int[] value = new int[N];
        for(int i = N - 1; i >= 0; i--) {
            value[i] = Integer.parseInt(reader.readLine());
        }

        int cnt = 0;
        for(int i = 0; i < N; i++) {
            if(K >= value[i]) {
                cnt += K / value[i];
                K = K % value[i];
            }
            if(K == 0) {
                break;
            }
        }
        System.out.println(cnt);
    }
}

 

2 1931 회의실 배정

 

3 11399 ATM
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 {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(reader.readLine());
        int[] time = new int[N];
        StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
        for(int i = 0; i < N; i++) {
            time[i] = Integer.parseInt(tokenizer.nextToken());
        }
        Arrays.sort(time);
        int prev = 0;
        int result = 0;
        for(int i = 0; i < N; i++) {
            prev += time[i];
            result += prev;
        }
        System.out.println(result);
    }
}

*prev(이전 누적 값)의 값을 작게 만들수록 최종 합이 최소가 된다.

*시간을 오름차 순으로 정렬 후 누

 

4 1541 잃어버린 괄호

괄호를 적절히 쳐서 식의 값을 최소로 만들기

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tokenizer = new StringTokenizer(reader.readLine(), "+-", true);
        List<Integer> operand = new ArrayList<>();
        while(tokenizer.hasMoreTokens()) {
            String token = tokenizer.nextToken();
            if(token.equals("+")) {
                int op1 = operand.remove(operand.size() - 1);
                int op2 = Integer.parseInt(tokenizer.nextToken());
                operand.add(op1 + op2);
            } else if(!token.equals("-")) {
                operand.add(Integer.parseInt(token));
            }
        }
        int result = operand.get(0);
        for(int i = 1; i < operand.size(); i++) {
            result -= operand.get(i);
        }
        System.out.println(result);
    }
}
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 {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer subExp = new StringTokenizer(reader.readLine(), "-");
        int result = Integer.MAX_VALUE;
        while(subExp.hasMoreTokens()) {
            StringTokenizer addExp = new StringTokenizer(subExp.nextToken(), "+");
            int temp = 0;
            while(addExp.hasMoreTokens()) {
                temp += Integer.parseInt(addExp.nextToken());
            }
            if(result == Integer.MAX_VALUE) {
                result = temp;
            } else {
                result -= temp;
            }
        }
        System.out.println(result);
    }
}
  • + +, + - 는 결과가 순서의 영향을 받지 않는다.
  • - + : - (+) 가 최소가 됨
  • - - : (-) - 가 최소가 됨

=> + 연산을 먼저, - 연산은 앞에서부터 순서대로

 

 

5 13305 주유소
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 {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(reader.readLine());
        StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
        int[] distance = new int[N-1];
        for(int i = 0; i < N - 1; i++) {
            distance[i] = Integer.parseInt(tokenizer.nextToken());
        }
        tokenizer = new StringTokenizer(reader.readLine());
        long min = Integer.MAX_VALUE;
        long totalPrice = 0;
        for(int i = 0; i < N - 1; i++) {
            int price = Integer.parseInt(tokenizer.nextToken());
            if(price < min) {
                min = price;
            }
            totalPrice += min * distance[i];
        }
        System.out.println(totalPrice);
    }
}

'CT' 카테고리의 다른 글

[BOJ] 26단계 이분 탐색  (0) 2023.05.17
[BOJ] 25단계 분할 정복  (0) 2023.05.09
[BOJ] 23단계 누적 합  (0) 2023.05.03
[BOJ] 22단계 동적 계획법 1  (0) 2023.04.20
[BOJ] 21단계 백트래킹  (0) 2023.04.18