μ½”λ”© ν…ŒμŠ€νŠΈ/λ°±μ€€

[λ°±μ€€]2916번 'λ„μ˜μ΄κ°€ λ§Œλ“  λ§›μžˆλŠ” μŒμ‹' 문제 풀이 - JavaScript

μš©λ‡½ 2023. 6. 13. 16:04
λ°˜μ‘ν˜•

[λ°±μ€€]9663번 'λ„μ˜μ΄κ°€ λ§Œλ“  λ§›μžˆλŠ” μŒμ‹' 문제 풀이 - JavaScript

문제

λ„μ˜μ΄λŠ” 짜파ꡬ리 μš”λ¦¬μ‚¬λ‘œ λͺ…성을 λ‚ λ Έμ—ˆλ‹€. μ΄λ²ˆμ—λŠ” 이전에 μ—†μ—ˆλ˜ μƒˆλ‘œμš΄ μš”λ¦¬μ— 도전을 해보렀고 ν•œλ‹€.

μ§€κΈˆ λ„μ˜μ΄μ˜ μ•žμ—λŠ” μž¬λ£Œκ°€ N개 μžˆλ‹€. λ„μ˜μ΄λŠ” 각 재료의 신맛 S와 쓴맛 Bλ₯Ό μ•Œκ³  μžˆλ‹€. μ—¬λŸ¬ 재료λ₯Ό μ΄μš©ν•΄μ„œ μš”λ¦¬ν•  λ•Œ, κ·Έ μŒμ‹μ˜ 신맛은 μ‚¬μš©ν•œ 재료의 μ‹ λ§›μ˜ 곱이고, 쓴맛은 합이닀.

μ‹œκ±°λ‚˜ μ“΄ μŒμ‹μ„ μ’‹μ•„ν•˜λŠ” μ‚¬λžŒμ€ λ§Žμ§€ μ•Šλ‹€. λ„μ˜μ΄λŠ” 재료λ₯Ό 적절히 μ„žμ–΄μ„œ μš”λ¦¬μ˜ 신맛과 μ“΄λ§›μ˜ 차이λ₯Ό μž‘κ²Œ λ§Œλ“€λ €κ³  ν•œλ‹€. 또, 물을 μš”λ¦¬λΌκ³  ν•  μˆ˜λŠ” μ—†κΈ° λ•Œλ¬Έμ—, μž¬λ£ŒλŠ” 적어도 ν•˜λ‚˜ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

재료의 신맛과 쓴맛이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 신맛과 μ“΄λ§›μ˜ 차이가 κ°€μž₯ μž‘μ€ μš”λ¦¬λ₯Ό λ§Œλ“œλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 재료의 개수 N(1 ≤ N ≤ 10)이 주어진닀. λ‹€μŒ N개 μ€„μ—λŠ” κ·Έ 재료의 신맛과 쓴맛이 곡백으둜 κ΅¬λΆ„λ˜μ–΄ 주어진닀. λͺ¨λ“  재료λ₯Ό μ‚¬μš©ν•΄μ„œ μš”λ¦¬λ₯Ό λ§Œλ“€μ—ˆμ„ λ•Œ, κ·Έ μš”λ¦¬μ˜ 신맛과 쓴맛은 λͺ¨λ‘ 1,000,000,000보닀 μž‘μ€ μ–‘μ˜ μ •μˆ˜μ΄λ‹€.

좜λ ₯

첫째 쀄에 신맛과 μ“΄λ§›μ˜ 차이가 κ°€μž₯ μž‘μ€ μš”λ¦¬μ˜ 차이λ₯Ό 좜λ ₯ν•œλ‹€. 

예제 μž…λ ₯ 1

4
1 7
2 6
3 8
4 9

예제 좜λ ₯ 1

1

πŸ‘‰ 풀이 μ½”λ“œ

const fs = require('fs');
const file = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(file).toString().trim().split('\n');

const n = Number(input[0]);
const arr = input.slice(1).map((line) => line.split(' ').map(Number));
const visited = new Array(n).fill(false);
let min = 1e9;
const result = [];

function dfs(depth) {
  if (depth >= 1) {
    let totalX = 1;
    let totalY = 0;
    for (const [x, y] of result) {
      totalX *= x;
      totalY += y;
    }
    min = Math.min(min, Math.abs(totalX - totalY));
  }

  for (let i = depth; i < n; i++) {
    if (visited[i]) continue;
    visited[i] = true;
    result.push(arr[i]);
    dfs(i + 1);
    result.pop();
    visited[i] = false;
  }
}
dfs(0);

console.log(min);

πŸ‘‰ 풀이 ν•΄μ„€

ν•΄λ‹Ή λ¬Έμ œλŠ” 재료λ₯Ό μ΄μš©ν•΄μ„œ 신맛과 μ“΄λ§›μ˜ 차이λ₯Ό μ΅œμ†Œλ‘œ λ§Œλ“œλŠ” 것을 κ΅¬ν•˜λŠ” λ¬Έμ œλ‹€.

N개의 μž¬λ£Œκ°€ 주어지고 이것듀을 잘 μ‘°ν•©ν•΄μ„œ ꡬ해야 ν•œλ‹€.

 

즉, 문제의 μš”κ΅¬μ‚¬ν•­μ€ N개의 μž¬λ£Œμ— λŒ€ν•œ κ°€λŠ₯ν•œ λͺ¨λ“  쑰합을 κ΅¬ν•˜λŠ” 것이닀.

κ·Έ μ΄μœ λŠ” (A, B, C) 3개의 μž¬λ£Œκ°€ μžˆλ‹€κ³  κ°€μ •ν•˜λ©΄

길이 #1: (A), (B), (C)

길이 #2: (A, B), (A, C), (B, C)

길이 #3: (A, B, C)

μ΄λ ‡κ²Œ λͺ¨λ“  쑰합을 κ΅¬ν•˜λ©΄μ„œ 차이의 μ΅œμ†Ÿκ°’μ„ 찾을 수 μžˆλ‹€.

λ°˜μ‘ν˜•

μž…μΆœλ ₯을 λ°›μ•„μ£Όκ³ , 방문을 μ²˜λ¦¬ν•  λ°°μ—΄κ³Ό μ΅œμ†Œκ°’μ„ 담아쀄 λ³€μˆ˜, μž¬κ·€λ₯Ό ν˜ΈμΆœν•˜λ©΄μ„œ 계산을 ν•΄μ•Ό ν•˜λŠ” 배열을 μ„ μ–Έν•΄ μ£Όμ—ˆλ‹€.

 

dfsν•¨μˆ˜μ—μ„œλŠ” depthκ°€ 1 이상 이면 무쑰건 계산이 κ°€λŠ₯토둝 ν•΄μ£Όμ—ˆλ‹€.

μ΄μœ λŠ” μ΅œμ†Œν•œ 1개 μ΄μƒμ˜ 재료λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜κ³  μ‘°ν•©λ§ˆλ‹€ 계산을 ν•΄μ€˜μ•Ό ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

이 κ³„μ‚°μ—μ„œλŠ” totalX(신맛)λŠ” μ΄ˆκΈ°μ— 곱을 ν• μ‹œ * 1λΆ€ν„° μ‹œμž‘ν•΄μ•Ό ν•˜κ³  totalY(쓴맛)λŠ” 0λΆ€ν„° 합을 κ΅¬ν•œλ‹€.

계산을 ν•œ λ’€ min λ³€μˆ˜μ— ν˜„μž¬ μ΅œμ†Ÿκ°’κ³Ό 신맛과 μ“΄λ§›μ˜ 차이λ₯Ό κ³„μ‚°ν•˜κ³  λ‘˜ 쀑 μ΅œμ†Ÿκ°’μ„ min λ³€μˆ˜μ— λ‹΄μ•„μ€€λ‹€. 

 

반λͺ©λ¬Έμ—μ„œλŠ” depthλΆ€ν„° μ‹œμž‘ν•΄μ„œ μ„ νƒλœ 재료의 λ‹€μŒ μž¬λ£ŒλΆ€ν„° μ„ νƒλ˜κ²Œ ν•΄ μ£Όκ³ ,

쑰합을 ꡬ할 λ•Œ λ™μΌν•œ μž¬λ£ŒλŠ” μ„ νƒλ˜μ§€ λͺ»ν•˜λ„둝 방문처리λ₯Ό ν•΄μ£Όμ—ˆλ‹€.

이미 μ„ νƒλœ(λ°©λ¬Έν•œ) 재료라면 λ‹€μŒ 재료둜 λ„˜μ–΄κ°€λ„λ‘ ν•˜κ³  μ„ νƒλ˜μ§€ μ•Šμ€(λ°©λ¬Έν•˜μ§€ μ•Šμ€) 재료라면 result 배열에 재료λ₯Ό λ„£μ–΄μ£Όκ³  dfsλ₯Ό μž¬κ·€μ μœΌλ‘œ ν˜ΈμΆœν•œλ‹€.

λλ‚˜λ©΄ κ³„μ‚°λœ μž¬λ£ŒλŠ” κΊΌλ‚΄μ£Όκ³  방문처리λ₯Ό ν•΄μ œν•΄ μ€€λ‹€.

 

λ§ˆμ§€λ§‰μœΌλ‘œ min을 좜λ ₯ν•΄ 결과둜 내보낸닀.

λ°˜μ‘ν˜•