๐ [๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ ํ์ด] Q.1715 ์นด๋ ์ ๋ ฌํ๊ธฐ ๋ฌธ์ ํ์ด
๐ ๋ฌธ์
https://www.acmicpc.net/problem/1715
์ ๋ ฌ๋ ๋ ๋ฌถ์์ ์ซ์ ์นด๋๊ฐ ์๋ค๊ณ ํ์. ๊ฐ ๋ฌถ์์ ์นด๋์ ์๋ฅผ A, B๋ผ ํ๋ฉด ๋ณดํต ๋ ๋ฌถ์์ ํฉ์ณ์ ํ๋๋ก ๋ง๋๋ ๋ฐ์๋ A+B ๋ฒ์ ๋น๊ต๋ฅผ ํด์ผ ํ๋ค.
์ด๋ฅผํ ๋ฉด, 20์ฅ์ ์ซ์ ์นด๋ ๋ฌถ์๊ณผ 30์ฅ์ ์ซ์ ์นด๋ ๋ฌถ์์ ํฉ์น๋ ค๋ฉด 50๋ฒ์ ๋น๊ต๊ฐ ํ์ํ๋ค.
๋งค์ฐ ๋ง์ ์ซ์ ์นด๋ ๋ฌถ์์ด ์ฑ ์ ์์ ๋์ฌ ์๋ค. ์ด๋ค์ ๋ ๋ฌถ์์ฉ ๊ณจ๋ผ ์๋ก ํฉ์ณ๋๊ฐ๋ค๋ฉด, ๊ณ ๋ฅด๋ ์์์ ๋ฐ๋ผ์ ๋น๊ต ํ์๊ฐ ๋งค์ฐ ๋ฌ๋ผ์ง๋ค.
์๋ฅผ ๋ค์ด 10์ฅ, 20์ฅ, 40์ฅ์ ๋ฌถ์์ด ์๋ค๋ฉด 10์ฅ๊ณผ 20์ฅ์ ํฉ์น ๋ค, ํฉ์น 30์ฅ ๋ฌถ์๊ณผ 40์ฅ์ ํฉ์น๋ค๋ฉด (10 + 20) + (30 + 40) = 100๋ฒ์ ๋น๊ต๊ฐ ํ์ํ๋ค. ๊ทธ๋ฌ๋ 10์ฅ๊ณผ 40์ฅ์ ํฉ์น ๋ค, ํฉ์น 50์ฅ ๋ฌถ์๊ณผ 20์ฅ์ ํฉ์น๋ค๋ฉด (10 + 40) + (50 + 20) = 120 ๋ฒ์ ๋น๊ต๊ฐ ํ์ํ๋ฏ๋ก ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
N๊ฐ์ ์ซ์ ์นด๋ ๋ฌถ์์ ๊ฐ๊ฐ์ ํฌ๊ธฐ๊ฐ ์ฃผ์ด์ง ๋, ์ต์ํ ๋ช ๋ฒ์ ๋น๊ต๊ฐ ํ์ํ์ง๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐ ์ ๊ทผ๋ฒ
Q.1715 ์นด๋ ์ ๋ ฌํ๊ธฐ ๋ฌธ์ ํ์ด์ ๋๋ค. ์นด๋ ๋ญ์น๋ค์ ์ ๋ ฌํ๋ ค ํ๋๋ฐ ์ต์ํ์ ๋น๊ต ํ์๋ก ์ ๋ ฌํ๋ ค๊ณ ํฉ๋๋ค.
๋ฌธ์ ์ ๋์ ์๋ ์์๋ฅผ ๋ณด๋ฉด ๊ฐ์ฅ ์ ์ ๋ ๋ฌถ์์ฉ ๊ณจ๋ผ ์๋ก ํฉ์ณ๋๊ฐ๋ฉด ์ต์ ๋น๊ต ํ์๋ก
์นด๋๋ฅผ ์ ๋ ฌํ ์ ์์์ ์ ์ ์์ต๋๋ค.
์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์ ์ ๋ต์ ๋์ถํ ์ ์์ต๋๋ค.
์ฐ์ ์์ ํ์ ์นด๋ ๋ฌถ์๋ค์ ๋ฃ์ด๋๊ณ
๊ฐ์ฅ ๋ฎ์ ์์ ์นด๋ ๋ญ์น๋ค๋ถํฐ ๋ ๋ฌถ์์ฉ ๊บผ๋ด ํฉ์น๊ณ
์์ง ๋น๊ตํ ์นด๋ ๋ญ์น๋ค์ด ๋จ์์๋ค๋ฉด ํฉ์น ์นด๋ ๋ญ์น๋ฅผ ๋ค์ ๋ฃ์ด์ค๋๋ค.
์ด๋ ๊ฒ ๋ฐ๋ณตํ์ฌ ๋ชจ๋ ์นด๋ ๋ญ์น๋ค์ ๊บผ๋๋ค๋ฉด ๋ ์ด์ ํฉ์น ์นด๋๊ฐ ์์ผ๋ฏ๋ก
์ด๋๊น์ง ๋น๊ตํ ํ์๊ฐ ์ต์ ๋น๊ต ํ์๊ฐ ๋ฉ๋๋ค.
๐ป ์ฝ๋
package problem.greedy;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
public class Main_1715 {
static int N;
static int[] cards;
static PriorityQueue<Integer> priorityQueue;
public static void main(String[] args) throws IOException {
input();
System.out.println(solve());
}
public static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
cards = new int[N];
priorityQueue = new PriorityQueue<>();
for (int i = 0; i < N; i++) {
cards[i] = Integer.parseInt(br.readLine());
priorityQueue.add(cards[i]);
}
br.close();
}
public static int solve() {
int answer = 0;
if (N == 1) {
return 0;
}
while (!priorityQueue.isEmpty()) {
int temp = priorityQueue.poll() + priorityQueue.poll();
answer += temp;
if (!priorityQueue.isEmpty()) {
priorityQueue.add(temp);
}
}
return answer;
}
}