๋ฌธ์ : https://school.programmers.co.kr/learn/courses/30/lessons/42897
1. ์๊ฐ ์ด๊ณผ ์ฝ๋ (Java)
(1) ์ฝ๋
class Solution {
public int solution(int[] money) {
int answer = 0;
int N = money.length;
int[][] dp = new int[N+1][2];
for (int i=2; i<=N; i++) {
dp[i][0] = Math.max(dp[i-2][0]+money[i-2], dp[i-1][0]);
dp[i][1] = Math.max(dp[i-2][1]+money[i-1], dp[i-1][1]);
}
return Math.max(dp[N][0], dp[N][1]);
}
}
(2) ์ฑ์ ๊ฒฐ๊ณผ
์ฒ์์๋ ์๋ฐ๋ก ์ ์ถํ๋๋ฐ, ์๊ฐ๋ณต์ก๋๊ฐ O(N)์ธ ์ฝ๋๋ฅผ ์ ์ถํ์์๋ ์๊ฐ ์ด๊ณผ๋ฅผ ๋ฐ์๋ค๐คฏ
์๊ณ ๋ฆฌ์ฆ์ ๋ฌธ์ ์ธ๊ฐ? ์ถ์ด์ ๊ฐ์ ์ฝ๋๋ฅผ C++๋ก ๋ง๋ค์ด์ ์ ์ถํด๋ดค๋ค.
2. ํต๊ณผ ์ฝ๋ (C++)
(1) ์ฝ๋
#include <string>
#include <vector>
using namespace std;
int solution(vector<int> money) {
int answer = 0;
int N = money.size();
int dp[1000001][2] = {0, };
for (int i=2; i<=N; i++) {
dp[i][0] = max(dp[i-2][0]+money[i-2], dp[i-1][0]);
dp[i][1] = max(dp[i-2][1]+money[i-1], dp[i-1][1]);
}
return max(dp[N][0], dp[N][1]);
}
(2) ์ฑ์ ๊ฒฐ๊ณผ
ํ๋ฒ์ ํต๊ณผ๋ฅผ ๋ฐ์๋ค. ์ด์ฏค ๋๋ฉด ์๊ณ ๋ฆฌ์ฆ์ ๋ฌธ์ ๋ ์๋์ง ์๋?๐ญ
๊ฒฐ๊ตญ ์๋ฐ๋ก ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋์ค ์๊ณ C++ ์ฝ๋๋ฅผ ํจ๊ป ์ ์ถํ๋๋ฐ, ๋ค๋ฅธ ์คํฐ๋์์ ์๋ฐ๋ก ํต๊ณผ๋ฅผ ๋ฐ์์๋ค. ์ฐจ์ด์ ์ ์ฐพ์๋ดค๋๋ฐ, ํ์๋ถ์ ์ฌ์ด์ฆ N์ง๋ฆฌ 1์ฐจ์ ๋ฐฐ์ด 2๊ฐ๋ฅผ ์ผ๊ณ , ๋๋ N*2 ํฌ๊ธฐ์ 2์ฐจ์ ๋ฐฐ์ด์ ์ผ๋ค.
3. ํต๊ณผ ์ฝ๋ (Java)
(1) ์ฝ๋
class Solution {
public int solution(int[] money) {
int N = money.length;
int[] first = new int[N+1];
int[] last = new int[N+1];
for (int i=2; i<=N; i++) {
first[i] = Math.max(first[i-2]+money[i-2], first[i-1]);
last[i] = Math.max(last[i-2]+money[i-1], last[i-1]);
}
return Math.max(first[N], last[N]);
}
}
(2) ์ฑ์ ๊ฒฐ๊ณผ
์ด๋ง์ด๋งํ ์๊ฐ ์ฐจ์ด๋ก ํต๊ณผ๋ฅผ ๋ฐ์๋ค. 2์ฐจ์ ๋ฐฐ์ด๋ณด๋ค๋ 1์ฐจ์ ๋ฐฐ์ด 2๊ฐ์ ์ ๊ทผ ์๋๊ฐ ๋น ๋ฅธ ๊ฒ ๊ฐ๋ค...๐ฅฒ
์ด ๋ฐ์ผ๋ก๋ ํ์ด์ ๊ด๋ จ ์๋ ๋ด์ฉ์ด์ง๋ง ์ต์ธํด์(...) ์์ธ์ ์ฐพ์๋ณด๊ธฐ๋ก ํ๋ค.
4. ์๋ฐ์์ 2์ฐจ์ ๋ฐฐ์ด์ด 1์ฐจ์ ๋ฐฐ์ด๋ณด๋ค ๋๋ฆฐ ์ด์
์ฌ์ค ์๋ฐ๋ 2์ฐจ์ ๋ฐฐ์ด์ด ์๋ค. ์ง์ง 2์ฐจ์ ๋ฐฐ์ด์ด๋ฉด ๋ชจ๋ ๋ธ๋ญ๋ค์ด ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋น๋ฐ์์ผ ํ์ง๋ง, ์๋ฐ๋ ๊ทธ๋ ์ง ์๋ค.
์๋ฐ์์ 2์ฐจ์ ๋ฐฐ์ด์ 1์ฐจ์ ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ค์ ์งํฉ์ด๋ค. dp[1], dp[2] ๋ฑ ๊ฐ ํ์ด ์ฐ์๋ ๊ณต๊ฐ์ ์ ์ฅ๋๋ค๋ ๊ฒ ์๋๋ผ๋ ์๋ฏธ. ์๋ง ๋ด๊ฐ dp ๋ฐฐ์ด์ [N][2]๋ก ์ ์ธํด์ ๊ณต๊ฐ์ง์ญ์ฑ์ ์ด์ ์ ๋ง์ด ๋ชป๋ณธ ๊ฒ๋ ๋ฌธ์ ์ด์ง ์์๊น ์ถ๋ค...๐ค
5. ์๊ฐ ์ธก์ ์คํ
import java.util.Stack;
class PGS_๋๋์ง_Test {
static final int N = 1_000_000;
static final int M = 2;
public static void main(String[] args) {
int[][] dp = new int[N][M];
int[] first = new int[N];
int[] last = new int[N];
for (int i=0; i<N; i++) {
for (int j = 0; j < M; j++) {
dp[i][j] = i * N + j;
}
first[i] = i;
last[i] = i;
}
access1D(first, last);
access2D(dp);
}
static void access1D(int[] first, int[] last) {
long startTime = System.nanoTime();
for (int i=0; i<N; i++) {
int tmp = first[i];
tmp = last[i];
}
long endTime = System.nanoTime();
System.out.println("1D Execution Time: " + (endTime-startTime));
}
static void access2D(int[][] dp) {
long startTime = System.nanoTime();
for (int i=0; i<N; i++) {
for (int j=0; j<M; j++) {
int tmp = dp[i][j];
}
}
long endTime = System.nanoTime();
System.out.println("2D Execution Time: " + (endTime-startTime));
}
}
1D Execution Time: 3622167
2D Execution Time: 5276750
ํ์คํ ์ฐํ ์๊ฐ์ ๋ณด๋ 2์ฐจ์ ๋ฐฐ์ด์ด ๋ ๋๋ ธ๋ค. ์๊ฐ ์ ํ์ด ๋นก๋นกํ ๋ฌธ์ ์์ N*M ํฌ๊ธฐ์ 2์ฐจ์ ๋ฐฐ์ด์ ์ ์ธํ๋ค๋ฉด, ๋ ์์ ์๋ฅผ ์์ผ๋ก ๋๋ ๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค.
'๐๐ฅ๐ ๐จ๐ซ๐ข๐ญ๐ก๐ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ๊ฒฝ์ฌ๋ก์ ๊ฐ์ (0) | 2023.11.12 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ฑ์ฐ์ฝ์ค ์ ํ๊ธฐ (1) | 2023.11.08 |
[ํ๋ก๊ทธ๋๋จธ์ค] ํ ๋ณํฉ (0) | 2023.09.10 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์๊ณผ ๋๋ (0) | 2023.09.07 |
[๋ฐฑ์ค 5052] ์ ํ๋ฒํธ ๋ชฉ๋ก (0) | 2023.09.04 |