1. 카드 정렬하기
- 우선 순위 큐를 이용해서 최소값들 먼저 뽑아서 더해서 다시 넣으면 그에 맞는 순서대로 더할 수 있다. 기억★★★★★
package problem_solving.greedy;
import java.util.PriorityQueue;
import java.util.Scanner;
public class BaekJoon_1715 {
static PriorityQueue<Integer> pq = new PriorityQueue<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.next());
for(int i= 0 ; i < n ; i++) {
pq.offer(Integer.parseInt(sc.next()));
}
if( n ==1 ) {
System.out.println(0);
return ;
}
int priSum = 0 ;
int answer =0 ;
int i = 0 ;
while(!pq.isEmpty()) {
if( i>=2 ) {
pq.offer(priSum);
answer+=priSum;
priSum = 0 ;
i= 0 ;
}else {
priSum+=pq.poll();
i++;
}
if( pq.size() == 0) {
answer+=priSum;
break;
}
}
System.out.println(answer);
}
}
2. 단어 수학
- 알파벳 문제 나올 시 각 단어들의 가중치를 고려해보자
package problem_solving.greedy;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
public class BaekJoon_1339 {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
int n = Integer.parseInt(sc.next());
String [] arr= new String[n];
for(int i = 0 ; i < arr.length;i++) {
arr[i] = sc.next();
}
Integer[] alpha = new Integer[26];
for(int i= 0 ; i < alpha.length;i++) {
alpha[i] = 0;
}
for(int i= 0 ; i < arr.length ; i++) {
int num = startNum(arr[i].length());
for(int j = 0 ; j < arr[i].length();j++) {
char c = arr[i].charAt(j);
alpha[(int)c-65] += num ;
num /= 10 ;
}
}
Arrays.sort(alpha,Collections.reverseOrder());
int sum = 0 ;
int count = 9 ;
for(int i= 0 ; i < alpha.length;i++) {
if( alpha[i] == 0 ) {
break;
}
sum+=alpha[i]*(count--);
}
System.out.println(sum);
}
public static int startNum(int len) {
int num = 1;
for(int i= 0 ; i < len-1 ; i++) {
num = num*10;
}
return num;
}
}
백준 레벨 변동
풀이 유형
