백준 2961 < 도영이가 만든 맛있는 음식 > JavaScript

2022. 12. 7.·☕️ 커리어 & 인터뷰 준비/코딩 테스트

📍문제 링크

https://www.acmicpc.net/problem/2961

 

2961번: 도영이가 만든 맛있는 음식

첫째 줄에 재료의 개수 N(1 ≤ N ≤ 10)이 주어진다. 다음 N개 줄에는 그 재료의 신맛과 쓴맛이 공백으로 구분되어 주어진다. 모든 재료를 사용해서 요리를 만들었을 때, 그 요리의 신맛과 쓴맛은

www.acmicpc.net

 

📍알고리즘 분류

- 브루트포스

- 비트마스킹

- 백트래킹

 

📍문제 풀이

- 두 수로 이루어진 배열을 원소로 갖는 이차원 배열이 주어질 때, 첫 번째 원소들의 곱과 두 번째 원소들의 합을 비교한 절대값이 최소가 되는 숫자를 찾아라!

- depth를 1부터 N 까지 반복하며 백트래킹을 활용하면 될것 같다.

 

📍의사 코드

-  depth = 1 부터 N 까지 반복하면서, 각 조합에 대해 절댓값을 구하는 백트래을 실시

 

📍코드 (JavaScript)

const [in1, ...in2] = require("fs")
  .readFileSync("/dev/stdin")
  .toString()
  .trim()
  .split("\n");

const N = +in1;
const data = in2.map((el) => el.split(" ").map(Number));
let answer = Number.MAX_SAFE_INTEGER;

for (let i = 1; i <= N; i++) {
  const result = [];
  const isUsed = [];

  const recursive = (depth) => {
    if (depth === i) {
      let multiply = 1;
      let sum = 0;
      result.forEach((el) => {
        const [a, b] = el;
        multiply *= a;
        sum += b;
      });
      answer = Math.min(answer, Math.abs(multiply - sum));
      return;
    }

    for (let j = 1; j <= N; j++) {
      if (!isUsed[j]) {
      	// 가지치기 조건 부여하면 오히려 시간 복잡도가 증가
        // if (
        //   depth > 0 &&
        //   (result[depth - 1][0] > data[j - 1][0] ||
        //     (result[depth - 1][0] === data[j - 1][0] &&
        //       result[depth - 1][1] > data[j - 1][1]))
        // )
        //   continue;
        result[depth] = data[j - 1];
        isUsed[j] = true;
        recursive(depth + 1);
        isUsed[j] = false;
      }
    }
  };

  recursive(0);
}
console.log(answer);

 

📍리뷰

- 시간 복잡도가 매우 높게 나와서, 출제의도에 어긋나는 풀이가 되어버렸다.

- DFS를 사용한 풀이들이 복잡도가 낮은 것을 보인다.

- 숫자 오름차순으로 조합을 구현하여 가지치기했는데, 오히려 시간복잡도가 증가해버린다.

- 비트마스킹을 공부하면 시간 복잡도를 낮출 수 있을 것 같다.

- 최솟값을 갱신할 때, 초깃값 Infinity 대신 Number.MAX_SAFE_INTEGER 를 사용할 수 있다

(JavaScript에서 안전한 최대 정수값 나타낸다. 2^53 - 1 = 대략 9천 조)

'☕️ 커리어 & 인터뷰 준비/코딩 테스트' 카테고리의 다른 글
  • 백준 3107 < IPv6 > JavaScript
  • 백준 2659 < 십자카드 문제 > JavaScript
  • 백준 1759 < 암호 만들기 > JavaScript
  • 백준 1918 < 후위 표기식 > JavaScript
지식물원
지식물원
지식이 자라는 식물원!
  • 지식물원
    지식물원
    지식물원
  • 전체
    오늘
    어제
    • 분류 전체보기 (510)
      • 🎨 프론트엔드 공부 (247)
        • JS & TS (86)
        • HTML & CSS (22)
        • React & Next (49)
        • Vue & Nuxt (22)
        • 기타 (68)
      • 🤓 기술 학습 & 공부 기록 (116)
        • Node.js (0)
        • Python (37)
        • 백엔드 (0)
        • 딥러닝 (1)
        • 컴퓨터 일반 (72)
        • 개발 인프라 (6)
      • 👨‍💻 프로젝트 경험 (6)
        • Work (0)
        • Toy (6)
      • ⚙️ 개발 팁 & 노하우 (21)
        • 프론트엔드 (6)
        • 기타 (15)
      • ☕️ 커리어 & 인터뷰 준비 (88)
        • 코딩 테스트 (88)
      • 📰 기술 트렌드 & 생각 정리 (4)
      • 📚 기타 (25)
        • 마케팅 (15)
        • 비개발서적 (10)
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

    • 모바일 접속 시 코드 하이라이팅 깨질 때
  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
지식물원
백준 2961 < 도영이가 만든 맛있는 음식 > JavaScript
상단으로

티스토리툴바