[TIL] Java Algorithm 2
์ฝ๋์คํ ์ด์ธ ๋ฐฑ์๋ ๋ถํธ์บ ํ D+40
๐ ์ง์ฅ์ ์๊ณ ๋ฆฌ์ฆ ์น์ ์ด ์ง๋๊ฐ๊ณ ์๋ค.
๋ชฉ์์ผ๊น์ง๋ง ์ ๋ง๋ฌด๋ฆฌํ๋ฉด,,, ์ด์ ์น์๋น์ค์ ๋ํ ๊ธฐ๋ฐ ์ง์์ ๋ฐฐ์ฐ๊ธฐ ์์ ํ ๊ฒ ๊ฐ๋ค.
์๊ณ ๋ฆฌ์ฆ์ ์๋ฌด๋๋ ์ฅ๊ธฐ์ ์ผ๋ก ๋ณด๊ณ ๊ณต๋ถํด์ผํ๋
์ปจํ
์ธ ๋ผ๊ณ ์๊ฐ๋๋ค๊ณ โฆ. ์ง๊ธ๊น์ง ๋ฌธ์ ๋ฅผ ํ๋ฉด์
์ดํด์๋๋ ๊ฒ๋ ์ต์ง๋ก ์ดํดํด๋ณด๋ ค๊ณ ๋
ธ๋ ฅ๋ ํด๋ดค๋ค.
80%์ ๋๋ ํ๊ณ 20% ์ ๋๋ ๋ ํผ๋ฐ์ค ์ฝ๋๋ฅผ ๋น๋ ธ๋๋ฐ
์ป์ด๊ฐ๋ ๊ฒ๋ ๋ง์๊ณ , ๋ฌธ๋ฒ์ ์ฐ์๋ ์กฐ๊ธ ๋ถ๋ช
ํ๊ฒ ์ฐ๋ ๊ฒ๋ค๋ ๋์ด๋ฌ๋ค.
์ค๋์ ์ด์ ๋ฐฐ์ด ์ด๋ก ์
์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํธ๋ ์๊ฐ์ ๊ฐ์ก๋ค.
์ค๋์ ๋ด๊ฐ ํผ ์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ์ ๋ฆฌํด๋ณด๋ คํ๋ค.
์์ธํ ๋ฌธ์ ๋ด์ฉ์ ์ฝ๋์คํ
์ด์ธ ์ธก์ ์๋ฃ์ด๊ธฐ ๋๋ฌธ์
๋ด๊ฐ ํ์๋ ๋ฐฉ์๊ณผ ๋๋ต์ ์ธ ๋งฅ๋ฝ๋ง ์ ๋ฆฌํด๋ณธ๋ค.
Greedy ๊ด๋ จ ๋ฌธ์ .
ํ์ ์๊ณ ๋ฆฌ์ฆ. ์ด๋ฆ ๋ถํฐ ํ์์ค๋ฝ๊ธฐ ๊ทธ์ง์๋ค.
๋ฌธ์ ๋ฅผ ํ๋ ์ต์ ์ ๋ฐฉ๋ฒ์ ์ฐพ์ ๋ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ฐฐ์ ๊ณ
์๋ ๊ฑฐ์ค๋ฆ๋์ ๋ํ ๋ฌธ์ ๋ฅผ ์ ์ฉํ๋ ๋ฌธ์ ์๋ค.
๋ด๊ฐ ์๊ฐํ์๋ ๋กค ์์ ๊ณผ ๋น์ทํ ๊ฒ ๊ฐ๋ค.
๋ผ์ธ์ ์ดํ ๋ณต๊ทํ๋ค์์
๋ด๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ณจ๋๋ฅผ ์ ๋ถ ์๋ฐํ๊ฒ ์ฌ์ฉํด์ผ
์ข ๋ ๊ฐํ ์ํ๋ก ๋ผ์ธ์ ์ ์ง์ํ ์ ์๋ค.
์ต์ ์ ๋ฐฉ๋ฒ์ ์ฐพ์ ๊ทธ๊ฑฐ์ ๋ง์ ์์ดํ
์ ์ฌ๋ ๊ฒ.
์ด๋ฒ ๋ฌธ์ ๋ ๊ฑฐ์ค๋ฆ๋๋ ๊ฐ์ ๊ฐ๋
์ด๋ค.
4260์์ ๋ฐ์๊ณ , ๊ฑฐ์ค๋ฆ๋์ด 500์,100์,50์,10์ ์ด๋ผ๊ณ ๊ฐ์ ํ์๋
500์ * 8
100์ * 2
50์ * 1
10์ * 1
์ด 12๊ฐ์ ๋์ ์ ๊ฑฐ์ฌ๋ฌ์ค์ผ ์ต์ ์ ์ ํ์ผ ๊ฒ์ด๋ค.
500์์ง๋ฆฌ๊ฐ ๋ถ์กฑํด ๋์ ์ ๋ง๊ตฌ์ค๋ค๋ฉด ๋ถ๋ช
ํ๋ ๊ฒ์ด ๋ถ๋ช
.
public int changeMoney(int k) {
// 1์, 5์, 10์, 50์, 100์, 500์ ๋์ ์๋๋งํผ ๋ฐํํ๊ธฐ
// ํฐ์๋ถํฐ ๋๋์ด ๋จ์ด์ง๋ ๋ชซ์ ๊ตฌํด ๋์ ์๋์ ๋ฃ๊ธฐ
// ๋๋จธ์ง๊ฐ์ผ๋ก ๋ค์ ์์ ๋ชซ์ ๊ตฌํ
int currentCoin = 0;
int remainCoin = k;
int[] coin = {500,100,50,10};
for(int i=0; i<coin.length; i++){
if(remainCoin>=coin[i]){
currentCoin += remainCoin/coin[i];
remainCoin = remainCoin%coin[i];
}
}
return currentCoin;
}
coin์ด๋ผ๋ ๊ฑฐ์ฌ๋ฌ์ค ์ ์๋ ๋์ ์ ์ข
๋ฅ์
์ด ๊ฑฐ์ฌ๋ฌ์ค์ผํ๋ ๊ธ์ก์ k๋ผ๋ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํด์ฃผ๊ฒ๋๋ค.
๋์ ์ ์ข
๋ฅ๋งํผ ๋ฐ๋ณต๋ฌธ์ ์คํ ์ํค๊ณ
๋์ ์ข
๋ฅ์๋ฐ๋ฅธ ๋จ์ ๊ธ์ก์ ๋๋ ๋ชซ์ ๋์ ๊ฐ์๋ก ๋๊ฒจ์ฃผ๊ฒ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ๋จ์ ๊ธ์ก์ ๋ค์ ๋์ ์ข
๋ฅ์ ๋๋ ์ง๊ฒ ๋๋ฉฐ
์ด๋ ๊ฒ ์ญ ์งํ ํ ๊ฒฐ๊ณผ ๋ฐํ๊ฐ์ ์์์ ์์ธก ํ๋ ๊ฒ๊ณผ ๊ฐ์ด 12๋ผ๋ ๊ฐ์ ์ป์ ์ ์๋ค.
simulate ๊ตฌํ ๋ฌธ์
๋ฐฐ์ด์ด๋ผ๋ ๋ณด๋๊ฒ์ ํ์์์
๋ง์ ์ด๋์์ผ ์ ์๋ฅผ ์ผ๋ง๋ ํ๋ํ๋์ง ์ถ์ถํด๋ด๋ ๋ฌธ์ ์๋ค.
์ด ๋ฌธ์ ๋ ์๋ฎฌ๋ ์ดํฐ ๊ตฌํ์ ๊ด๋ จ๋ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์๋ค.
ํด๋น ์ง์์ฌํญ๋๋ก ์ดํํด ๋ด๊ฐ ์ป์ ์ ์๋ฅผ ํ๋ณํ๋?
๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ์ฃผ์ด์ง ๋ฌธ์ ์ ์ผ์ด์ค๋ง ์ ์ฒ๋ฆฌํ๋ฉด ๋๋ ๋ฌธ์ ์๋ค.
public Integer game(int[][] board, String operation) {
// TODO:
int ud = 0;
int rl = 0;
int count = 0;
if(board[ud][rl]==1) count = 1;
for(int i=0; i<operation.length(); i++){
try{
int test = 0;
if(operation.charAt(i)=='U') ud -= 1;
if(operation.charAt(i)=='D') ud += 1;
if(operation.charAt(i)=='R') rl += 1;
if(operation.charAt(i)=='L') rl -= 1;
test = board[ud][rl];
}catch (ArrayIndexOutOfBoundsException e){ // ๋ฒ์๊ฐ์ด ๋ฒ์ด๋๋ฉด return null ํด์ฃผ๋ ๊ตฌ๋ฌธ
return null;
}
if(board[ud][rl]>0) count+=board[ud][rl];
}
return count;
}
ํด๋น ๋ฌธ์ ์์๋ ์ฃผ์ด์ง ๋ฐฐ์ด์ ์ ์๊ฐ ๋งค๊ฒจ์ ธ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋๋ช
๋ น์ ๋ด๋ฆฌ๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ฉฐ
0,0์์น์์ ์์ํ๊ณ U,R,L,D๋ผ๋ ์ด๋ ๋ช
๋ น์ ํตํด ๋ฐฐ์ดํ์ ์ด๋ํ๋ฉฐ
์ด๋์ ํด๋นํ์ ์ ์๊ฐ ์์ผ๋ฉด ๊ทธ ์ ์๋ฅผ ํ๋ํ์ฌ
์ต์ข
์ ์ผ๋ก ์ด๋๋ช
๋ น์ ์๋ฃ ํ์๋์ ์ ์๋ฅผ ํฉ์ฐํด์ฃผ๋ ๋ฌธ์ ๋ค.
์ฌ๊ธฐ์ ๋ฌธ์ ๋ ๊ฒ์ํ์ ๋ฒ์ด๋ฌ์ ๊ฒฝ์ฐ null๋ก ๋ฆฌํดํด์ฃผ๋
์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ผํ๋ค.
DP ๋ฌธ์
๋์ ๊ณํ๋ฒ์ ๊ดํ ๋ฌธ์ ๋ค.
๋ณต์กํ ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ๊ฐ์ ์์๋ฌธ์ ๋ก ๋๋ ํด๊ฒฐํ๋ ํ์ด๋ฒ์ด๋ค.
๊ฐ์ฅ ๋ํ์ ์ธ ์๋ก๋ ํผ๋ณด๋์น ์์ด์ ์๋ก๋ ๋ค.
์๋์ ๊ธ์ ์ฐธ๊ณ ํ์ฌ ๊ณต๋ถ๋ฅผ ํ์๊ณ ์์ ๋ก ์ ์ ํ๋ค๊ณ ์๊ฐํ๋ค.
๋์ ๊ณํ๋ฒ(Dynamic Programming) Reference
์ด๋ฒ ๋ฌธ์ ์ ๊ฐ์ ๊ฒฝ์ฐ๋ ๋์ ๊ณํ๋ฒ์ ์ ์ฉํด์ผํ๋ ๋ฌธ์ ์๊ณ
์๋์ ๊ฑฐ์ฌ๋ฌ์ฃผ๋๋ฐ ๊ฐ์ง๊ณ ์๋ ๋์ ์ ์ข
๋ฅ์์
ํด๋น ์๋์ ๊ฑฐ์ฌ๋ฌ์ค ์ ์๋ ๊ฒฝ์ฐ์ ์๊ฐ ๋ช๊ฐ์ง๊ฐ ๋๋๊ฐ?
์ด ๋ถ๋ถ์ด ํต์ฌ ๋ฌธ์ ์๊ณ , ๋๋ ์๋์ ๊ฐ์ด ํํํ๋ค.
public long dp(int money, int[] type) {
// ๋ชฉํ๊ธ์ก์ ๊ฒฝ์ฐ์์๋ฅผ ๋ด๊ธฐ์ํ ๋ฐฐ์ด
long[] numberOfCase = new long[money+1];
// ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค๋ ์๊ธฐ์์ ์ ์ซ์์ ๊ฒฝ์ฐ์ ์๋ก 1๋ก ๊ณ ์
numberOfCase[0] = 1;
// ๋์ ํ์
์ ์ํํ ํฌ๋ฌธ
for(int coin=0; coin<type.length ; coin++){
for(int noc=1; noc<numberOfCase.length; noc++){
// ๋์ ํ์
์ด ํด๋น ๊ฒฝ์ฐ์์ ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ์๋ง ๊ฒฝ์ฐ์์๋ฅผ ์ฒดํฌ
// ์ฆ 10์์ ํ์
๋์ ์ด ๋ค์ด์์ ๊ฒฝ์ฐ 10์ ์ด์์ ๊ฒฝ์ฐ์๋ง ์กฐ๊ฑด๋ฌธ์คํ๊ฐ๋ฅ
if(type[coin]<=noc){
// ํด๋น ๋์ ํ์
์ผ๋ก ๋ง๋ค์ ์๋ ์ผ์ด์ค๋ฅผ ๊ฐ ์ผ์ด์ค๋ณ๋ก ์ ์ฅ 10์์ผ๋ก๋ 20์,30์,40์....
// ์ญ์ญ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ํด๋นํ๋ ์์ 1์ฉ ์ฆ๊ฐ์ํค๊ธฐ
numberOfCase[noc] = numberOfCase[noc]+numberOfCase[noc-type[coin]];
}
}
}
return numberOfCase[money];
}
์์ ๋ก
50์์ ๊ฑฐ์ฌ๋ฌ์ค์ผํ๊ณ
10์,20์,50์ ์ด๋ผ๋ ์๋์ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด
์ผ๋งํผ์ ๊ฒฝ์ฐ์ ์๋ก ๋์ ์ ์ง๋ถํด์ผํ๋๊ฐ?
50ย - ๊ฒฝ์ฐ์ ์ 1
20ย ย 20ย ย 10ย - ๊ฒฝ์ฐ์ ์ 2
20ย 10ย 10ย 10ย - ๊ฒฝ์ฐ์ ์ 3
10ย ย 10ย ย 10ย 10ย 10 - ๊ฒฝ์ฐ์ ์ 4
์์ ๊ฐ์ด 3๊ฐ์ ์๋์ผ๋ก 4๊ฐ์ง์ ์ง๋ถ ๊ฒฝ์ฐ์ ์๊ฐ ๋์ค๊ฒ๋๋ค.
- 50์์ผ๋ก ์ง๋ถ
- 20์ 2๊ฐ + 10์ 1๊ฐ
- 20์ 1๊ฐ + 10์ 3๊ฐ
- 10์ 5๊ฐ
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์ ์ ์๋ ๊ฒ์ ๋์ ์ข
๋ฅ๋ณ๋ก ๋ฌธ์ ๋ฅผ ๋๋์ด ํ ์ ์๋ค๋ ์ ์ด๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์์ ์ฝ๋๋ฅผ ์คํ ์ํค๋ฉด
ํ์ ๋ฌธ์ (๋์ ์ข
๋ฅ๋ณ๋ก ๊ฒฝ์ฐ์ ์ ์ฒดํฌ)๋ค์ ๋๋์ด ํ๊ณ
๊ทธ๊ฒ์ ๊ฒฐํฉํด์ ์ต์ข
์ ์ผ๋ก ์๋์๋ํ
๋์ ์ง๋ถ ๊ฒฝ์ฐ์ ์๊ฐ ๋์ค๊ฒ๋๋ ๊ฒ์ด๋ค.
์ฌ์ค ์์ง ๋์ ๊ณํ๋ฒ์ ๋ํด ์ฌ๋๊น์ ์ดํด๋
์ด๋ ค์ด ์ํ์ด๋ค. ์ด๋์ ๋ ๋งฅ๋ฝ๊ณผ ์ฌ์ฉ๋ฒ์ ์๊ฒ ์ง๋ง
๋ค๋ฅธ ์์ฉ๋ ๋ฌธ์ ๊ฐ ๋์์ ๋, ๋ด๊ฐ ์ด๋ฌธ์ ๋ฅผ
๋์ ๊ณํ๋ฒ์ ์ ์ฉํด ํ ์ ์์์ง๋ ์์ง ๋ฏธ์ง์์ด๋ค..
์ค๋์ ๊ณต๋ถ๋ ์ฌ๊ธฐ๊น์ง!
์ค๋์ ์ปคํผ๋: โ๏ธ โ๏ธ โ๏ธ
์ค๋์ ์ ์ฌ: ๋ผ๋ฉด