Skip to content

Conversation

@uyeon0
Copy link
Collaborator

@uyeon0 uyeon0 commented Feb 1, 2026

User description

오늘도 멋져요 👍✨


PR Type

Enhancement


Description

  • 프로그래머스 86053 문제 해결 (금과 은 운반하기)

  • 이분 탐색 알고리즘 구현

  • 시간 복잡도 최적화된 솔루션


@uyeon0 uyeon0 added the programmers Programmers 문제 풀이 label Feb 1, 2026
@github-actions
Copy link

github-actions bot commented Feb 1, 2026

PR Reviewer Guide 🔍

🧪 No relevant tests
⚡ Recommended focus areas for review

알고리즘 최적화

이분 탐색 알고리즘의 시간 복잡도와 공간 복잡도를 분석하고, 최적의 이분 탐색 구현 여부를 검토해야 합니다.

function solution(a, b, g, s, w, t) {
  // time 시간 안에 모든 도시에서 필요한 광물들을 운반할 수 있는지를 확인
  function check(time) {
      const cityCount = g.length;
      let gold = 0, silver = 0, total = 0;
      for (let i = 0; i < cityCount; i++) {
          // time 시간 안에 "운반"할 수 있는 최대 횟수
          const maxDeliveries = Math.floor(time / (2 * t[i])) + (time % (2 * t[i]) >= t[i] ? 1 : 0);
          // time 시간 안에 운반할 수 있는 광물의 최대 양
          const cap = maxDeliveries * w[i];

          gold += Math.min(g[i], cap);
          silver += Math.min(s[i], cap);
          total += Math.min(g[i] + s[i], cap);
      }

      return gold >= a && silver >= b && total >= a + b;
  }

  // 이분탐색
  let left = 0, right = 10 ** 15;
  while (left < right) {
      const mid = Math.floor((right + left) / 2);
      if (check(mid)) right = mid;
      else left = mid + 1;
  }

  return left;
경계 조건

다양한 입력 크기와 극단적인 케이스에서 알고리즘의 정확성을 검증해야 합니다. 특히 도시 수, 광물 양, 운반 시간 등의 극단값에 대한 테스트가 필요합니다.

function solution(a, b, g, s, w, t) {
  // time 시간 안에 모든 도시에서 필요한 광물들을 운반할 수 있는지를 확인
  function check(time) {
      const cityCount = g.length;
      let gold = 0, silver = 0, total = 0;
      for (let i = 0; i < cityCount; i++) {
          // time 시간 안에 "운반"할 수 있는 최대 횟수
          const maxDeliveries = Math.floor(time / (2 * t[i])) + (time % (2 * t[i]) >= t[i] ? 1 : 0);
          // time 시간 안에 운반할 수 있는 광물의 최대 양
          const cap = maxDeliveries * w[i];

          gold += Math.min(g[i], cap);
          silver += Math.min(s[i], cap);
          total += Math.min(g[i] + s[i], cap);
      }

      return gold >= a && silver >= b && total >= a + b;
  }

  // 이분탐색
  let left = 0, right = 10 ** 15;
  while (left < right) {
      const mid = Math.floor((right + left) / 2);
      if (check(mid)) right = mid;
      else left = mid + 1;
  }

  return left;

@github-actions
Copy link

github-actions bot commented Feb 1, 2026

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
General
이분 탐색 로직 가독성 개선

이분 탐색 로직을 더 명확하고 가독성 있게 리팩토링할 수 있습니다. 변수 이름을 더 의미 있게 변경하고, 이분 탐색 경계 조건을 명시적으로 처리하세요.

Programmers/Level3/86053_금과_은_운반하기.js [10-38]

 function solution(a, b, g, s, w, t) {
-  function check(time) {
+  const canTransportAllMinerals = (time) => {
       const cityCount = g.length;
-      let gold = 0, silver = 0, total = 0;
+      let totalGold = 0, totalSilver = 0, totalMinerals = 0;
+      
       for (let i = 0; i < cityCount; i++) {
-          const maxDeliveries = Math.floor(time / (2 * t[i])) + (time % (2 * t[i]) >= t[i] ? 1 : 0);
-          const cap = maxDeliveries * w[i];
+          const roundTripTime = 2 * t[i];
+          const maxRounds = Math.floor(time / roundTripTime) + (time % roundTripTime >= t[i] ? 1 : 0);
+          const transportCapacity = maxRounds * w[i];
           
-          gold += Math.min(g[i], cap);
-          silver += Math.min(s[i], cap);
-          total += Math.min(g[i] + s[i], cap);
+          totalGold += Math.min(g[i], transportCapacity);
+          totalSilver += Math.min(s[i], transportCapacity);
+          totalMinerals += Math.min(g[i] + s[i], transportCapacity);
       }
       
-      return gold >= a && silver >= b && total >= a + b;
+      return totalGold >= a && totalSilver >= b && totalMinerals >= a + b;
+  };
+  
+  let minTime = 0, maxTime = 10 ** 15;
+  while (minTime < maxTime) {
+      const midTime = Math.floor((maxTime + minTime) / 2);
+      if (canTransportAllMinerals(midTime)) maxTime = midTime;
+      else minTime = midTime + 1;
   }
   
-  let left = 0, right = 10 ** 15;
-  while (left < right) {
-      const mid = Math.floor((right + left) / 2);
-      if (check(mid)) right = mid;
-      else left = mid + 1;
-  }
-  
-  return left;
+  return minTime;
 }
Suggestion importance[1-10]: 7

__

Why: The suggestion improves code readability by using more descriptive variable names and extracting the transportation check logic into a more clearly named function. The core algorithm remains unchanged, making it a solid refactoring suggestion.

Medium

@yoouyeon yoouyeon added the ready-to-merge pr을 머지해주세요 label Feb 2, 2026
@uyeon0 uyeon0 merged commit 29245b1 into main Feb 2, 2026
9 checks passed
@yoouyeon yoouyeon self-assigned this Feb 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

programmers Programmers 문제 풀이 ready-to-merge pr을 머지해주세요

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants