[PS] 99ํด๋ฝ ์ฝํ ์คํฐ๋ 23์ผ์ฐจ TIL (๋ง๋ฒ์ ์๋ฆฌ๋ฒ ์ดํฐ)
ํ๊ทธ: 99ํด๋ฝ, PS, TIL, ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ, ์ฝ๋ฉํ ์คํธ์ค๋น, ํญํด99
์นดํ ๊ณ ๋ฆฌ: PS
๋ฌธ์
์ค๋ช
์๋ฆฌ๋ฒ ์ดํฐ๋ฅผ ํ๊ณ 0์ธต ์ผ๋ก ๋ด๋ ค๊ฐ๋๋ฐ ๋๋ฅผ ์ ์๋ ๋ฒํผ์ 10^c ๋ก๋ง ์ฃผ์ด์ง๋ค. 0์ธต์ ๊ฐ๋๋ฐ ํ์ํ ์ต์ ๋ฒํผ ํ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ . ์๋ฅผ ๋ค์ด ํ์ฌ ์ธต์ด 16 ์ธต์ด๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๋ค์ด ์๋ค.
1
2
3
4
5
6
// 16์ธต์์ 0์ธต์ ๊ฐ๋ ๋ฐฉ๋ฒ
// 1.
-10, -10, +1, +1, +1, +1 ==> ๋ฒํผ ์ฌ์ฏ๋ฒ ๋๋ฅด๋ ๊ฒฝ์ฐ
// 2.
-10, -1, -1, -1, -1, -1, -1 ==> ๋ฒํผ ์ผ๊ณฑ๋ฒ ๋๋ฅด๋ ๊ฒฝ์ฐ
๋ฒํผ์ ์ต์๋ก ๋๋ฅด๋ ํ์๋ ์ฌ์ฏ๋ฒ ์ด๋ค.
์๋ํ ๋ฐฉ๋ฒ
์ผ๋จ +1
์ด๋ -1
์ ๋๋ฅด๋ ํ์๋ฅผ ์ต์ํ ํด์ผ ํ๋ค. ์ ์์์ 16 ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ -1 ์ ์ฌ์ฏ๋ฒ ๋๋ฃจ๋ ๊ฒ๋ณด๋ค -10 ์ ํ๋ฒ ๋๋ฅธ ํ +1 ์ ๋๋ฅด๋ ํ์๊ฐ ๋ ์ ๋ค๋ ๊ฒ์ ์ฐฉ์ํ๋ฉด,
- 1์ ์๋ฆฌ ์ซ์๊ฐ 5๋ณด๋ค ํฐ ๊ฒฝ์ฐ ์ฌ๋ฆผ์ ํด์ 20์ผ๋ก ๋ง๋ค๊ณ ์ถ๋ฐํ๋ ๊ฒ์ด ๋ ์ด๋์ด๋ค.
- 1์ ์๋ฆฌ ์ซ์๊ฐ 5๋ณด๋ค ์์ ๊ฒฝ์ฐ ๊ทธ ์ซ์๋งํผ -1 ํน์ +1 ์ ํด์ค์ผ ํ๋ค.
์ฌ๋ฆผ์ ํ์ํ ์๋ฅผ ์นด์ดํธํด answer ๋ณ์์ ๋ด๊ณ , storey ๋ ๊ทธ๋งํผ ๋๋ ค์ค๋ค. ๊ทธ ํ 1์ ์๋ฆฌ๋ฅผ ์ ์ธํ ์ซ์๋ถํฐ ๋ค์ ๋ฐ๋ณตํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public int solution(int storey) {
int answer = 0;
while (storey > 0) {
int lastNum = storey % 10;
if (lastNum > 5) {
answer += (10 - lastNum);
storey += (10 - lastNum);
} else {
answer += lastNum;
}
storey /= 10;
}
return answer;
}
}
์ด๋๋ก ํ๋ฆด ์ค ์์๋๋ฐ, ํต๊ณผ๋ฅผ ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ์์ด์ ๋ค์ ์๊ฐํด๋ดค๋ค. ์๋ฅผ ๋ค์ด 54 ์ธ ๊ฒฝ์ฐ ๋จผ์ 60์ ๋ง๋ค๊ณ ์ถ๋ฐํ ์ง, 50์ ๋ง๋ค๊ณ ์ถ๋ฐํ ์ง ์๊ฐํด๋ณด๋ฉด -1 ๋๋ +1 ์ ์ต์๋ก ๋๋ฅด๋ ค๋ฉด 54์์ ๊ฐ๊น์ด 50 ์ผ๋ก ๊ฐ๋๊ฒ์ด ๋ ์ ๋ฆฌํ๋ค. ๊ทธ๋ฌ๋ 65 ์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํด ๋ณผ ์ ์๋ค. 65๋ ์ฌ๋ฆผํ๋๊ฒ ์ ๋ฆฌํ๋ค
์ฆ, ๋ง์ง๋ง ์ซ์๊ฐ 5์ธ ๊ฒฝ์ฐ ์ฌ๋ฆผ์ด ์ ๋ฆฌํ์ง ๋ด๋ฆผ์ด ์ ๋ฆฌํ์ง๋ ๊ทธ ๋ค์ ์ซ์๊น์ง ํ์ธํด์ผ ํ๋ค.
ํ์ด (๊ทธ๋ฆฌ๋)
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ : ๊ฐ ์๋ฆฌ์๋ง๋ค 0์ ๋ง๋ค๊ธฐ ์ํ ์ต์ ์ ์ ํ์ ํด์ผ ํ๋ค.
1
2
[ 0, 1, 2, 3, 4, 5 ] --> ๊ทธ๋ฅ -1 ์ฉ ๋นผ๋ ๊ฒ ์ ๋ฆฌ
[ 6, 7, 8, 9 ] --> +1 ์ ๋๋ฌ 10์ ๋ง๋ค๊ณ -10 ์ ํ๋๊ฒ ์ ๋ฆฌ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public int solution(int storey) {
int answer = 0;
while (storey > 0) {
int lastNum = storey % 10;
if (lastNum > 5 || (lastNum == 5 && (storey / 10) % 10 >= 5)) {
answer += (10 - lastNum);
storey += (10 - lastNum);
} else {
answer += lastNum;
}
storey /= 10;
}
return answer;
}
}
๋ง์ง๋ง ์ซ์๊ฐ 5์ธ ๊ฒฝ์ฐ์ ๋ค์ ์ซ์๋ ํ์ธํ๋ค. ๋ค์ ์ซ์๋ 5 ์ด์์ธ ๊ฒฝ์ฐ์ ์ฌ๋ฆผ์ด ์ ๋ฆฌํ๋ค.
ํ์ด (๊ทธ๋ฆฌ๋ + DP)
์ฌ๋ฆผ, ๋ด๋ฆผ์ ๊ฒฝ์ฐ๋ฅผ ์ ๋ค๋ณด๋ ์ ํ์์ด ๋ฐ๊ฒฌ๋๋ค. ์ฌ๋ฆผ๊ณผ ๋ด๋ฆผ ๋ ์ค ์ต์๊ฐ์ ์ ํํ๋ฉด ๋๋๋ฐ, ๊ฒฝ์ฐ์ ์๋ฅผ ํ๋จํ๋ ๋ฐฉ์์ด ์ฌ๊ท์ ์ผ๋ก ์ํ๋๋ค. dp ๋ dfs ๋ก๋ ํ์ด๊ฐ ๊ฐ๋ฅํ ๊ฒ ๊ฐ๋ค.
1
f(65) = Math.min(5 + f(7), 5 + f(6))
์ ํ์์ ๊ทธ๋๋ก ์ฝ๋๋ก ์ฎ๊ธฐ๋ฉด ์๋์ ๊ฐ๋ค. 10 ์ดํ์ ์์ ๋ํด์ ์ฌ๊ทํจ์๋ก ์ฒ๋ฆฌํ ํ์ ์์ด ๋ฐ๋ก ๋ฆฌํดํ๋ค.
top-down
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
private final Map<Integer, Integer> memo = new HashMap<>();
public int solution(int storey) {
int answer;
if (storey <= 5) {
return storey;
} else if (storey < 10) {
return 11 - storey;
}
if (memo.containsKey(storey)) {
return memo.get(storey);
}
int lastNum = storey % 10;
int down = solution(storey / 10) + lastNum;
int up = solution(storey / 10 + 1) + (10 - lastNum);
answer = Math.min(down, up);
memo.put(storey, answer);
return answer;
}
}
bottom-up
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public int solution(int storey) {
int[] dp = new int[storey + 1];
dp[1] = 1;
dp[2] = 2;
dp[3] = 3;
dp[4] = 4;
dp[5] = 5;
dp[6] = 5;
dp[7] = 4;
dp[8] = 3;
dp[9] = 2;
for (int i = 10; i <= storey; i++) {
int lastNum = i % 10;
dp[i] = Math.min(dp[i / 10 + 1] + (10 - lastNum), dp[i / 10] + lastNum);
}
return dp[storey];
}
}
ํ๊ณ
๊ทธ๋ฆฌ๋๋ ๊ทธ ์์ฒด๋ก ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํ๊ธฐ ๋ณด๋ค๋ ๋ฌธ์ ํ์ด์ ํต์ฌ ์์ด๋์ด์ด๊ณ , ๊ทธ๊ฑธ ์ด์ฉํด ํ์ดํ๋ ๋ฐฉ์์ ์ฌ๋ฌ๊ฐ์ง๋ก ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋๊ผ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ