본문 바로가기
CODING TEST/THEORY

임시) 그리디

by 정성인(人) 2024. 6. 13.

그리디 알고리즘

 

  • 그리디를 썼을 때 최적의 해를 도출해 낼 수 있는 문제가 있고 아닌 게 있음
    • ⇒ 이 문제에 그리디 쓸 수 있는지 판단해야 함
  • 뭔가 문제 보니까 최소, 최대를 구하는 문제가 많네
  • 그리디 알고리즘은 또 우선순위 큐와 자주 쓰이네
    • 또는 정렬하는 로직이 자주 쓰이네

 

문제 32, 동전 개수의 최솟값 구하기

 

  • 그리디 썼을 때 반례 안 생기는 지 한번 따져봐야 함
    • (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)
    • 즉 2 4 8처럼 배수 관계란 소리 → 그냥 현재 상태에서 가장 큰 동전부터 차례대로 나눠주면 되는 게 성립이 되는 것임
    • 반례) 동전 1 6 7 있고, 금액 12를 맞춘다면
      • 그리디 알고리즘 → 7이 1개, 1이 5개
      • 그러나 동전 최소값은 → 6이 2개
      • 배수 형태가 아니면 이런 반례가 생김

 

문제 33, 카드 정렬하기

  • 카드 개수가 작은 묶음부터 순서대로 합치는 것이 전체 비교 횟수를 줄일 수 있는 방법임
    • 현재 데이터 중 가장 작은 카드의 개수를 가진 묶음 2개를 뽑아야 하고, 이 2개를 기준으로 합친 새 카드 묶음을 다시 데이터에 넣고 정렬해야 함
    • 즉 데이터의 삽입 삭제, 정렬이 자주 일어난다는 뜻 ⇒ 우선순위 큐를 이용해야 함

 

문제 34, 수를 묶어서 최댓값 만들기

  • 가능한 큰 수끼리 묶어야 결과값이 커진다는 걸 알 수 있음
  • 음수끼리 곱하면 양수로 변하는 성질을 추가로 고려
  • PriorityQueue<Integer> plusPq = new PriorityQueue<>(Collections.reverseOrder());
    • Collections.reverseOrder() 이런 게 있구나, 내림차순으로 정렬되도록 하는 것
  • plusPq.size()

 

문제 35, 회의실 배정하기

  • 현재 회의의 종료 시간이 빠를수록 → 다음 회의와 겹치지 않게 시작하는 데 유리함
    • ⇒ 그렇기에 종료 시간이 빠른 순서대로 정렬해 겹치지 않는 회의실을 적절하게 선택하면 됨
Arrays.sort(A, new Comparator<int[]>() {
      @Override
      public int compare(int[] S, int[] E) {
        if (S[1] == E[1]) { // 종료 시간이 같을 경우
          return S[0] - E[0];
        }
        return S[1] - E[1];
      }
    });

 

문제 36, 최솟값 만드는 괄호 배치

  • 가장 작은 최솟값을 만들기 위해서 가능한 큰 수를 빼야 함
    • 수식이 더하기와 빼기로만 이뤄져 있기에,
    • 더하기에 해당하는 부분에 괄호를 쳐서 먼저 모두 계산 후 빼기를 실행하면 문제 해결됨
  •  String[] str = example.split("-");
    • "55-40+55" 입력받으면 -> ["55", "45+55"] 문자열 배열을 반환
  •  String temp[] = a.split("[+]");
    • a.split("+")는 에러남
    • 그냥 써도 되는 부호: ! # % & @ ` ' : ; - , . < > ~ 
    • []로 씌우거나 앞에 \\를 붙여야 하는 게 있음 => a.split("[+]") or a.split("\\+")

'CODING TEST > THEORY' 카테고리의 다른 글

임시) 정수론  (0) 2024.06.18
임시) 탐색  (0) 2024.06.09
[임시] 정렬  (0) 2024.06.03
[임시] 스택과 큐  (0) 2024.05.29
[임시] 슬라이딩 윈도우  (0) 2024.05.28