π λ¬Έμ
μμ κ°μ λͺ¨μμΌλ‘ λ°°μ΄λ μ«μ μνμ΄ μμ΅λλ€. μ«μ νμ λνλ μ΄ λμΌν μνμ μ¬μ©νμ¬ μ«μλ‘λ§ μ΄λ£¨μ΄μ§ κΈ΄ λ¬Έμμ΄μ λκ° κ°μ₯ λΉ λ₯΄κ² νμ΄ννλμ§ κ²¨λ£¨λ λνμ
λλ€.
λνμ μ°Έκ°νλ €λ λ―Όν¬λ λ μμ§ μκ°λ½μ μ΄μ©νμ¬ νμ΄νμ ν©λλ€. λ―Όν¬λ νμ μΌμ μμ§λ₯Ό 4 μμ, μ€λ₯Έμ μμ§λ₯Ό 6 μμ λκ³ νμ΄νμ μμν©λλ€. μμ§ μκ°λ½μ μμ§μ¬ λ€μ μ«μλ₯Ό λλ₯΄λ λ°μλ μΌμ μκ°μ΄ λλλ€. λ―Όν¬λ μ΄λ€ λ μ«μλ₯Ό μ°μμΌλ‘ μ
λ ₯νλ μκ° λΉμ©μ λͺλͺ κ°μ€μΉλ‘ λΆλ₯νμμ΅λλ€.
- μ΄λνμ§ μκ³ μ μ리μμ λ€μ λλ₯΄λ κ²μ κ°μ€μΉκ° 1μ λλ€.
- μνμ’μ°λ‘ μΈμ ν μ«μλ‘ μ΄λνμ¬ λλ₯΄λ κ²μ κ°μ€μΉκ° 2μ λλ€.
- λκ°μ μΌλ‘ μΈμ ν μ«μλ‘ μ΄λνμ¬ λλ₯΄λ κ²μ κ°μ€μΉκ° 3μ λλ€.
- κ°μ§ μκ³ μΈμ νμ§ μμ μ«μλ₯Ό λλ₯Ό λλ μ κ·μΉμ λ°λΌ κ°μ€μΉ ν©μ΄ μ΅μκ° λλ κ²½λ‘λ₯Ό λ°λ¦ λλ€.
μλ₯Ό λ€μ΄ 1 μμ μλ μκ°λ½μ 0 μΌλ‘ μ΄λνμ¬ λλ₯΄λ κ²μ 2 + 2 + 3 = 7 λ§νΌμ κ°μ€μΉλ₯Ό κ°μ΅λλ€.
λ¨, μ«μ μνμ λ²νΌμ ν¬κΈ°κ° μκΈ° λλ¬Έμ κ°μ μ«μ λ²νΌ μμ λμμ λ μμ§ μκ°λ½μ μ¬λ €λμ μ μμ΅λλ€. μ¦, μ΄λ€ μ«μλ₯Ό λλ¬μΌ ν μ°¨λ‘μ κ·Έ μ«μ μμ μ¬λ €μ Έ μλ μκ°λ½μ΄ μλ€λ©΄ λ°λμ κ·Έ μκ°λ½μΌλ‘ λλ¬μΌ ν©λλ€.
μ«μλ‘ μ΄λ£¨μ΄μ§ λ¬Έμμ΄ numbersκ° μ£Όμ΄μ‘μ λ μ΅μνμ μκ°μΌλ‘ νμ΄νμ νλ κ²½μ°μ κ°μ€μΉ ν©μ return νλλ‘ solution ν¨μλ₯Ό μμ±ν΄μ£ΌμΈμ.
μ νμ¬ν
- 1 ≤ numbersμ κΈΈμ΄ ≤ 100,000
- numbersλ μλΌλΉμ μ«μλ‘λ§ μ΄λ£¨μ΄μ§ λ¬Έμμ΄μ λλ€.
μ μΆλ ₯ μ
"1756" | 10 |
"5123" | 8 |
βοΈ μ²«λ²μ§Έ μ€λ΅μ λ΄€λ νμ΄ (μ λ΅νμ΄λ μλ!)
μ²μ μλνλ μ¬κ·λ₯Ό μ΄μ©ν μ κ·Όλ°©λ²μΌλ‘ μ€λ΅μΈλ‘λ₯Ό κ²½ννλ€. μ€ν μ΄ λ무 λ§μ΄ μμ¬μμΈμ§ λ°νμμλ¬λ λ°μνλ€.(κ·Έλ΄λ§ν΄..?)
μ°μ μ²μμΌλ‘ boardλΌλ λ³μλ₯Ό νλ μ μΈνλ€. μ΄ boardμλ μ΄μ°¨μλ°°μ΄μ ν λΉνλλ° μ΄λ μΈλ±μ€λ₯Ό λ²νΈλ‘ κ°μ§κ³ μΈλΆ λ°°μ΄μ μμλ‘λ λ°°μ΄λ‘ μμΉλ₯Ό κ°μ§λ€. ex) 1μ΄λΌλ μ«μλ κ°λ‘ 1λ²μ§Έ, μΈλ‘ 1λ²μ§Έ -> [1, 1]
κ·Έ λ€μ calcDistλΌλ ν¨μλ₯Ό μμ±νλ€. boardλ₯Ό λ°νμΌλ‘ λ²νΈ μ¬μ΄μ (κ°μ€μΉ)λ₯Ό ꡬνλ€. μλ₯Ό λ€μ΄ 1λ²μμ 3λ²μΌλ‘ κ° λλ μ°λ°©ν₯μΌλ‘ 2νμ΄κΈ°λλ¬Έμ κ°μ€μΉλ 4κ° λλ€. μ΄λ₯Ό μ«μμ μμΉλ₯Ό λ°νμΌλ‘ κ³μ°νλ€. νμ¬ μ«μμ λͺ©νλ‘ νλ μ«μμ μμΉ(board)λ₯Ό κ±°λ¦¬λ‘ κ³μ°νλ€. κ°κ° μΈλ‘ κ°λ‘μ λ¨μ΄μ§ 거리λ₯Ό κ³μ°νκ³ λ μ(κ°λ‘, μΈλ‘)κ° λͺ¨λ 0μ΄μμ΄λ©΄ λκ°μ μΌλ‘ κ° μ μκΈ° λλ¬Έμ +3μ ν΄μ£Όκ³ , λ μ€ νλλ§ μ‘΄μ¬ν κ²½μ° μνμ’μ°λ‘ μ΄λνλ κ²½μ°μ΄λ―λ‘ +2λ₯Ό ν΄μ€λ€.
μ΄μ μ¬κ·λ₯Ό λλ€. μΌμ μ€λ₯Έμ κ°κ° λͺ©νλ‘ νλ μμΉλ‘ μ΄λνμ¬ κ°μ€μΉλ₯Ό κ³μ°νλ λ§μ½ κ°μ€μΉκ° λμΌνλ€λ©΄ μ¬κ·ν¨μλ₯Ό νΈμΆνκ³ κ·Έλ μ§ μμΌλ©΄ λ μμ μ«μλ₯Ό λν΄μ£Όκ³ νμ¬ μμ μμΉλ₯Ό λ³κ²½μμΌμ€λ€. λ§μ§λ§ μ«μκΉμ§ μ΄ κ³Όμ μ λ°λ³΅νλ©΄μ answerμ Math.minμ μ΄μ©νμ¬ μ΅μκ°μ ν λΉν΄μ€¬λ€.
μ λ΅μ μ λμ€λ κ² κ°μ§λ§ λ°νμμλ¬! -> μλ§ μ¬κ·λ‘ μΈν μ€ν μ΄ λ무 λ§μ΄ μμ¬μλ‘ μμνλ€.
β¨οΈ 첫λ²μ§Έ μ€λ΅ μ½λ
function solution(numbers) {
var answer = Infinity;
const board = [
[4, 2],
[1, 1],
[1, 2],
[1, 3],
[2, 1],
[2, 2],
[2, 3],
[3, 1],
[3, 2],
[3, 3],
];
const calcDist = (now, target) => {
if (now == target) return 1;
const [nowX, nowY] = board[now];
const [targetX, targetY] = board[target];
let x = Math.abs(nowX - targetX);
let y = Math.abs(nowY - targetY);
let cnt = 0;
while (x || y) {
if (x && y) {
cnt += 3;
x -= 1;
y -= 1;
} else if (x) {
cnt += 2 * x;
x = 0;
} else if (y) {
cnt += 2 * y;
y = 0;
}
}
return cnt;
};
const calc = (pos, idx, w) => {
for (idx; idx < numbers.length; idx++) {
const temp1 = calcDist(pos[0], numbers[idx]);
const temp2 = calcDist(pos[1], numbers[idx]);
if (temp1 === temp2) {
calc([numbers[idx], pos[1]], idx + 1, w + temp1);
calc([pos[0], numbers[idx]], idx + 1, w + temp2);
return;
} else if (temp1 < temp2) {
w += temp1;
pos[0] = numbers[idx];
} else {
w += temp2;
pos[1] = numbers[idx];
}
}
answer = Math.min(w, answer);
return;
};
calc([4, 6], 0, 0);
return answer;
}
βοΈ μ λ΅ νμ΄
μ¬κ·λ₯Ό μ΄μ©νλ€κ° μκ°μ΄κ³Όκ° λλ€λ©΄ DPμμΌλ‘ νμ΄μΌνμ§ μμκΉ? λΌλ μκ°μ νλ€. νμ§λ§ μΌμ μ€λ₯Έμμ μμΉλ₯Ό κ³ λ €νλκ² μ½μ§ μμλ€... dp λ°°μ΄μ λ»νλ checkμ μ μλ λ€μκ³Ό κ°λ€. μΌμ°¨μλ°°μ΄λ‘ λͺ¨λ κ°μ '-'λ‘ μ΄κΈ°ννλ€.
check[k][i][j] = k+1 λ²μ§Έ μ«μμμ i μΌμ, j μ€λ₯ΈμμΌ λμ μ΅μ κ°μ€μΉ
μμμ νμλ μ€λ΅μ λ΄μ©μ μΌλΆ μ¬μ©νλ€.
board(λ³μ) = μ΄μ°¨μλ°°μ΄λ‘ μΈλ±μ€λ₯Ό λ²νΈλ‘ κ°μ§κ³ κ° κ°μ λ°°μ΄λ‘ μ’νλ₯Ό κ°μ§λ€.
calcDist(ν¨μ) = λ²νΈ μ¬μ΄μ κ°μ€μΉλ₯Ό ꡬνλ ν¨μ. boardλ₯Ό κΈ°μ€μΌλ‘ λ μ μ¬μ΄μ 거리λ₯Ό ꡬνκ³ κ±°λ¦¬λ₯Ό κ³μ°ν΄ κ°μ€μΉλ₯Ό ꡬν¨.
μ«μ(numbers)λ₯Ό μννλ©΄μ μΌμ 0~9 μ€λ₯Έμ 0~9μΈ κ²½μ°λ₯Ό νμΈνλ€.
첫λ²μ§Έλ‘ κ³μ°ν μ μλ μ΄κΈ°κ°μ΄ μμ΄μΌ νλ―λ‘ check[0]μ λν΄ μ΄κΈ°νλ₯Ό μμΌμ€¬λ€.
- check[0][4][numbers[0]] = calcDist(6, numbers[0]);
- check[0][numbers[0]][6] = calcDist(4, numbers[0]);
κ°μ λ²νΈμ μμμ΄ μ¬λΌκ° μ μμΌλ―λ‘ iμ jκ° κ°μ κ²½μ°λ continue μμΌμ£Όκ³ λ§μ½ checkμ μ΄μ κ°μ΄ '-'μΈ κ²½μ° κ°λ₯ν κ²½μ°κ° μκΈ° λλ¬Έμ continue μμΌμ€¬λ€.
check[k-1][i][j]κ° μλ κ²½μ° μΌμ λλ μ€λ₯Έμμ μμ§μ¬ νμ¬ λ²νΈλ₯Ό λλ₯΄λ μν©μ κ³μ°νλ€. calcDist ν¨μλ₯Ό κ°κ° μ¬μ©νλ€.
- check[k][i][νμ¬μ«μ] -> μΌμμ΄ νμ¬μ«μλ‘ μμ§μΈ κ²½μ°
- check[k][νμ¬μ«μ][j] -> μ€λ₯Έμμ΄ νμ¬μ«μλ‘ μμ§μΈ κ²½μ°
μ΄λ₯Ό λ°λ³΅νκ³ checkλ°°μ΄(dpλ°°μ΄)μμ λ§μ§λ§ μ«μμ ν΄λΉνλ numbers.length-1λ²μ§Έλ₯Ό νμΈνλ€. check[numbers.length-1] λ§μ§λ§ μ«μκΉμ§ λͺ¨λ μννμ λ μΌμ iμμΉ, μ€λ₯Έμ j μμΉμΌ λμ κ°μ€μΉμ λν κ°μ κ°μ§κ³ μλ€. μ΄λ₯Ό μννλ©° κ°μ₯ μμ μ΅μκ°μ ꡬν΄μ€¬λ€.
β¨οΈ μ λ΅ μ½λ
function solution(numbers) {
var answer = Infinity;
const board = [
[4, 2],
[1, 1],
[1, 2],
[1, 3],
[2, 1],
[2, 2],
[2, 3],
[3, 1],
[3, 2],
[3, 3],
];
const check = [...Array(numbers.length)].map(_ => [...Array(10)].map(_ => new Array(10).fill('-')));
const calcDist = (now, target) => {
if (now == target) return 1;
const [nowX, nowY] = board[now];
const [targetX, targetY] = board[target];
let x = Math.abs(nowX - targetX);
let y = Math.abs(nowY - targetY);
let cnt = 0;
while (x || y) {
if (x && y) {
cnt += 3;
x -= 1;
y -= 1;
} else if (x) {
cnt += 2 * x;
x = 0;
} else if (y) {
cnt += 2 * y;
y = 0;
}
}
return cnt;
};
check[0][4][numbers[0]] = calcDist(6, numbers[0]);
check[0][numbers[0]][6] = calcDist(4, numbers[0]);
for (let k = 1; k < numbers.length; k++) {
for (let i = 0; i < 10; i++) {
for (let j = 0; j < 10; j++) {
if (i === j) continue;
if (check[k - 1][i][j] === '-') continue;
const calc1 = check[k - 1][i][j] + calcDist(j, numbers[k]);
if (check[k][i][numbers[k]] === '-') check[k][i][numbers[k]] = calc1;
else check[k][i][numbers[k]] = Math.min(check[k][i][numbers[k]], calc1);
const calc2 = check[k - 1][i][j] + calcDist(i, numbers[k]);
if (check[k][numbers[k]][j] === '-') check[k][numbers[k]][j] = calc2;
else check[k][numbers[k]][j] = Math.min(check[k][numbers[k]][j], calc2);
}
}
}
for (let i = 0; i < 10; i++) {
for (let j = 0; j < 10; j++) {
if (check[numbers.length - 1][i][j] === '-') continue;
answer = Math.min(answer, check[numbers.length - 1][i][j]);
}
}
return answer;
}
'Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Algorithm] νΈν λ°© λ°°μ (0) | 2023.03.23 |
---|---|
[Algorithm] νν κ°λ₯ν μ΄μ§νΈλ¦¬ (0) | 2023.03.22 |
[Algorithm] κΈκ³Ό μ μ΄λ°νκΈ° (0) | 2023.03.20 |
[Algorithm] μ°μ νμ€ λΆλΆ μμ΄μ ν© (0) | 2023.03.19 |
[Algorithm] κ±°μ€λ¦λ (0) | 2023.03.18 |