Problem ๐ป
https://school.programmers.co.kr/learn/courses/30/lessons/12941
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก, ์ฑ์ฉ๊น์ง Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
๋ฌธ์ ์ค๋ช
๊ธธ์ด๊ฐ ๊ฐ์ ๋ฐฐ์ด A, B ๋๊ฐ๊ฐ ์์ต๋๋ค. ๊ฐ ๋ฐฐ์ด์ ์์ฐ์๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
๋ฐฐ์ด A, B์์ ๊ฐ๊ฐ ํ ๊ฐ์ ์ซ์๋ฅผ ๋ฝ์ ๋ ์๋ฅผ ๊ณฑํฉ๋๋ค. ์ด๋ฌํ ๊ณผ์ ์ ๋ฐฐ์ด์ ๊ธธ์ด๋งํผ ๋ฐ๋ณตํ๋ฉฐ, ๋ ์๋ฅผ ๊ณฑํ ๊ฐ์ ๋์ ํ์ฌ ๋ํฉ๋๋ค. ์ด๋ ์ต์ข
์ ์ผ๋ก ๋์ ๋ ๊ฐ์ด ์ต์๊ฐ ๋๋๋ก ๋ง๋๋ ๊ฒ์ด ๋ชฉํ์
๋๋ค.
(๋จ, ๊ฐ ๋ฐฐ์ด์์ k๋ฒ์งธ ์ซ์๋ฅผ ๋ฝ์๋ค๋ฉด ๋ค์์ k๋ฒ์งธ ์ซ์๋ ๋ค์ ๋ฝ์ ์ ์์ต๋๋ค.)
์๋ฅผ ๋ค์ด A = [1, 4, 2] , B = [5, 4, 4] ๋ผ๋ฉด
- A์์ ์ฒซ๋ฒ์งธ ์ซ์์ธ 1, B์์ ์ฒซ๋ฒ์งธ ์ซ์์ธ 5๋ฅผ ๋ฝ์ ๊ณฑํ์ฌ ๋ํฉ๋๋ค. (๋์ ๋ ๊ฐ : 0 + 5(1x5) = 5)
- A์์ ๋๋ฒ์งธ ์ซ์์ธ 4, B์์ ์ธ๋ฒ์งธ ์ซ์์ธ 4๋ฅผ ๋ฝ์ ๊ณฑํ์ฌ ๋ํฉ๋๋ค. (๋์ ๋ ๊ฐ : 5 + 16(4x4) = 21)
- A์์ ์ธ๋ฒ์งธ ์ซ์์ธ 2, B์์ ๋๋ฒ์งธ ์ซ์์ธ 4๋ฅผ ๋ฝ์ ๊ณฑํ์ฌ ๋ํฉ๋๋ค. (๋์ ๋ ๊ฐ : 21 + 8(2x4) = 29)
์ฆ, ์ด ๊ฒฝ์ฐ๊ฐ ์ต์๊ฐ ๋๋ฏ๋ก 29๋ฅผ return ํฉ๋๋ค.
๋ฐฐ์ด A, B๊ฐ ์ฃผ์ด์ง ๋ ์ต์ข ์ ์ผ๋ก ๋์ ๋ ์ต์๊ฐ์ return ํ๋ solution ํจ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
์ ํ์ฌํญ- ๋ฐฐ์ด A, B์ ํฌ๊ธฐ : 1,000 ์ดํ์ ์์ฐ์
- ๋ฐฐ์ด A, B์ ์์์ ํฌ๊ธฐ : 1,000 ์ดํ์ ์์ฐ์
[1, 4, 2] | [5, 4, 4] | 29 |
[1,2] | [3,4] | 10 |
์
์ถ๋ ฅ ์ #1
๋ฌธ์ ์ ์์์ ๊ฐ์ต๋๋ค.
์
์ถ๋ ฅ ์ #2
A์์ ์ฒซ๋ฒ์งธ ์ซ์์ธ 1, B์์ ๋๋ฒ์งธ ์ซ์์ธ 4๋ฅผ ๋ฝ์ ๊ณฑํ์ฌ ๋ํฉ๋๋ค. (๋์ ๋ ๊ฐ : 4) ๋ค์, A์์ ๋๋ฒ์งธ ์ซ์์ธ 2, B์์ ์ฒซ๋ฒ์งธ ์ซ์์ธ 3์ ๋ฝ์ ๊ณฑํ์ฌ ๋ํฉ๋๋ค. (๋์ ๋ ๊ฐ : 4 + 6 = 10)
์ด ๊ฒฝ์ฐ๊ฐ ์ต์์ด๋ฏ๋ก 10์ return ํฉ๋๋ค.
Approach 1 โ - ๋์ ์ด๊ธฐ ์๊ฐ
์ด ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด์ ๊ฐ ์ธํธ์ ์๋ค์ด ๊ณฑํ ๋ ํญ์ ์ต์๊ฐ ๋๊ฒ ๋ ๋ง๋ค์ด์ฃผ๋๊ฒ์ด๋ค.
์ด๋ค ์๋ค์ด ๊ณฑํ ๋ ์ต์๊ฐ ๋๋์ง๋ฅผ ์ฆ, ์ด๋ค ์๋ค๋ผ๋ฆฌ ์ธํธ๋ก ๋ง๋์ด์ ๊ณฑํด์ค์ผ ํ๋์ง ๊ฐ์ด ์ค์ง ์๋๋ค.
์ํ์ ๊ฐ๋ ์ ๋ถ์กฑ์ธ์ง ์ฝ๋๋ก ์ด๋ป๊ฒ ์ธํธ๊ฐ ์ต์๊ฐ์ด ๋๊ฒ ๋ ํด์ผ ํ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค.
๋ค๋ง ๋๋ ๋ฐฐ์ด์์ ํ๋์ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ๋ง ๊ตฌํ ์ ์์ ๋ฟ์ด๋ค.
Approach 2 โญ - ๋์ ์ด๊ธฐ ์๊ฐ์ ๋ํ ๊ต์
1. ๋ฌธ์ ์ ํต์ฌ๊ณผ ๋ ผ๋ฆฌ
์ด ๋ฌธ์ ๋ ๋ฐฐ์ด A์ B์ ๊ฐ ์์๋ฅผ ๊ณฑํ ๊ฐ๋ค์ ํฉ์ด ์ต์๊ฐ ๋๋๋ก ๋ง๋๋ ๋ฌธ์ ์ด๋ค.
ํต์ฌ ์ฌ๊ณ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
1.1 ์ต์๊ฐ์ ๋ง๋๋ ์๋ฆฌ :
- ์ด๋ค ์๋ค์ ๊ณฑ์ด ์ต์๊ฐ ๋๋ ค๋ฉด ํ ๋ฐฐ์ด์ ๊ฐ์ฅ ํฐ ๊ฐ๊ณผ ๋ค๋ฅธ ๋ฐฐ์ด์ ๊ฐ์ฅ ์์ ๊ฐ์ ๊ณฑํด์ผ ํ๋ค. - ๋๋ ์ํ์ ๊ฐ๋ ์ด ๋ถ์กฑํ๋ค.
- ๋ฐฐ์ด A๋ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ , ๋ฐฐ์ด B๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ฉด ํญ์ ์ต์๊ฐ์ ์ป์ ์ ์๋ค. - ์ฝ๋๋ก ํ์ด๋ด๋ ๊ฐ๋ ๋ ๋ถ์กฑํ๋ค.
1.2 ์ ์ด๋ ๊ฒ ํด์ผ ํ๋๊ฐ?
์๋ฅผ ๋ค์ด, ๋ ๋ฐฐ์ด A = [1, 3, 5]์ B = [2, 4, 6] ์ด ์๋ค๊ณ ํ์.
์์ ์๋ ํฐ ์์ ๊ณฑํด์ผ ๋ ์ ์ ์ํฅ์ ์ค๋ค.
๋ฐ๋๋ก ํฐ์ ๋ผ๋ฆฌ ๊ณฑํ๋ฉด ๊ณฑ์ ๊ฒฐ๊ณผ๊ฐ ๋ ์ปค์ ธ ์ต์ ๊ฐ์ ์๊ฒ ๋๋ค.
์ ๋ ฌํ ํ ๋์ํ๋ ์์๋ผ๋ฆฌ ๊ณฑํด์ฃผ๋ฉด ์ต์ ํฉ์ ๊ตฌํ ์ ์๋ค.
2.๋ฌธ์ ๊ฐ ์๊ตฌํ๋ ์ฌ๊ณ ๋ ฅ์ ๋ฌด์์ผ๊น?
1. ๋ฌธ์ ๋ถ์ ๋ฅ๋ ฅ :
๊ณฑ์ ๊ฒฐ๊ณผ๊ฐ ์ต์๊ฐ ๋๋ ค๋ฉด ์ด๋ค ์๋ฆฌ(์ ๋ ฌ)์ ์ ์ฉํด์ผ ํ๋์ง ๋ฌธ์ ๋ฅผ ์ํ์ ์ผ๋ก ๋ถ์ํ ์ ์์ด์ผ ํ๋ค.
2. ์ ๋ ฌ๊ณผ ๋ฐฐ์ด ํ์ฉ :
๋ฐฐ์ด์ ์ ๋ ฌํ ํ, ํน์ ๋ฐฉ์(์ค๋ฆ์ฐจ์/ ๋ด๋ฆผ์ฐจ์)์ผ๋ก ์ํํ๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด๋ด์ผ ํ๋ค.
3. ์ต์ ํ ์ฌ๊ณ :
์ต์๊ฐ์ ์ฐพ๋ ๊ณผ์ ์์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ์ต์ํํ๊ฑฐ๋ ๋ด์ฅ ํจ์๋ฅผ ํ์ฉํด ํจ์จ์ ์ธ ์ฝ๋๋ก ์์ฑํด์ผ ํ๋ค.
3. ๋ฌธ์ ์ดํด ๋ฐ ์ฌ๊ณ ๊ณผ์
3.1 ๋ฌธ์ ๋ถ์
- ๋ ๊ฐ์ ๋ฐฐ์ด A์ B๊ฐ ์ฃผ์ด์ง๋ค.
- ๊ฐ ๋ฐฐ์ด์ ์์๋ฅผ ํ๋์ฉ ๊ณฑํด์ ์ต์๊ฐ ๋๊ฒ ํ๋ค.
- ์์๋ฅผ ์ฌ๋ฐฐ์น ํ ์ ์๋ค.
3.2 ์ปดํจํฐ์ ์ฌ๊ณ ๊ณผ์
๊ทธ๋ฆฌ๋(Greedy) ์๊ณ ๋ฆฌ์ฆ ์ ์ฉ :
ํฐ ์์ ์์ ์๋ฅผ ๊ณฑํด์ผ ์ ์ฒด ํฉ์ด ์ต์ํ๋จ.
์ฆ, A์ ์์ ์์ B์ ํฐ ์๋ฅผ ๊ณฑํ๋ ๋ฐฉ์์ด ์ต์ ์ ํด๊ฐ ๋๋ค.
3.3 ์ํ์ ์ ๊ทผ
A๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ, B๋ฅผ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ์ฌ ์ธ๋ฑ์ค๋ณ ๊ณฑ์
4. ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ
- A๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ.
- B๋ฅผ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
- ๊ฐ์ ์ธ๋ฑ์ค์์ ์์๋ฅผ ๊ณฑํ๊ณ ๋ํ๋ค.
- ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
Solution ๐ก
import java.util.Arrays;
public class Solution {
public int solution (int[] A, int[] B) {
// ๋ฐฐ์ด A๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
Arrays.sort(A);
// ๋ฐฐ์ด B๋ฅผ Integer ๋ฐฐ์ด๋ก ๋ณํ ํ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
Integer[] BInteger = Arrays.stream(B).boxed().toArray(Integer[]::new);
Arrays.sort(BInteger, Collections.reverseOrder());
int answer = 0;
for (int i = 0; i < A.length; i++) {
// A์ ์์ ๊ฐ * B์ ํฐ ๊ฐ
answer += A[i] * BInteger[i];
}
return answer;
}
}
5. ์ฝ๋ ์์ฑ์ ํ์ํ Java ๋ฌธ๋ฒ
5.1 ๋ฐฐ์ด ์ ๋ ฌ
Arrays.sort(A); // ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
Arrays.sort(B, Collections.reverseOrder()); // ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ (๋จ,int[]๋ถ๊ฐ๋ฅ -> Integer[] ๋ณํ ํ์)
5.2 ๋ฐฐ์ด ๋ณํ (int[] -> Integer[])
Java์ Arrays.sort()๋ int[]์ ๋ฐ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ ์ ์์ผ๋ฏ๋ก ๋ณํํด์ผ ํ๋ค.
Integer[] BInteger = Arrays.stream(B).boxed().toArray(Ingeger[]::new);
์๋ฐ์ int[]์ ๊ธฐ๋ณธํ(primitive type)์ด๋ผ Collections.sort()์์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ์ ํ๋ ค๋ฉด ๊ฐ์ฒดํ(Integer[])์ผ๋ก ๋ณํํด์ผ ํ๋ค.
5.2.1 Arrays.stream(B)
๋ฐฐ์ด B๋ฅผ ์คํธ๋ฆผ(stream)์ผ๋ก ๋ณํํ๋ค. Stream์ ์ฐ์๋ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ค๋ฃฐ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
"์ฐ์๋ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ค๋ฃฐ ์ ์๋ค"๋ ์๋ฏธ๋ ๋ฌด์์ผ๊น?
- ์๋ฐ์ Stream API๋ ๋ฐ์ดํฐ์ ํ๋ฆ์ ํ ์ค๋ก ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์ฆ, ๋ฐฐ์ด(List,Set,Map ๋ฑ ์ปฌ๋ ์ )์ด๋ ํ์ผ, ์ ๋ ฅ ๋ฐ์ดํฐ ๋ฑ์ ์์ฐจ์ ์ผ๋ก ์ฝ๊ณ ๊ฐ๊ณตํ๋ ๊ณผ์ ์ ์ฝ๊ฒ ํ ์ ์๋๋ก ๋์์ค๋ค.
[Java] Stream()์ ๋ฐฐ์ด์ด๋ ์ปฌ๋ ์ (List, Set ๋ฑ)์์ ์์ฑํ๋ ๋ฉ์๋.
“์ฐ์๋ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ค๋ฃฐ ์ ์๋ค”๋ ์๋ฏธ ์๋ฐ์ Stream API๋ ๋ฐ์ดํฐ์ ํ๋ฆ์ ํ ์ค๋ก ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.์ฆ, ๋ฐฐ์ด(List, Set, Map ๋ฑ ์ปฌ๋ ์ )์ด๋ ํ์ผ, ์ ๋ ฅ ๋ฐ์ดํฐ ๋ฑ์ ์
yeonbikim.tistory.com
5.3 for๋ฌธ์ ์ด์ฉํ ๋์ ํฉ ๊ตฌํ๊ธฐ
int sum = 0;
for (int i = 0; i < A.length; i++) {
sum += A[i] * BInteger[i];
}
6. ์๊ฐ ๋ณต์ก๋ ๋ถ์
- Arrays.sort(A) -> O(N log N)
- Arrays.sort(B) -> O(N log N)
- ์ต์ข ์ ์ผ๋ก O(N log N)
Reference ๐ - ์ต์ ํ(int[] ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ)
Integer[] ๋ณํ์ด ๋ถํธํ๋ฉด, PriorityQueue๋ฅผ ํ์ฉํ ์ ์๋ค.
import java.util.*;
class Solution {
public int solution(int[] A, int[] B) {
Arrays.sort(A); //A ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
for (int b : B) {
pq.add(b);
}
int sum = 0;
for (int i = 0; i < A.length; i++) {
sum += A[i] * pq.poll(); //๊ฐ์ฅ ํฐ ๊ฐ๊ณผ ๊ณฑํจ
}
return sum;
}
}