일기-79

정해준·2024년 7월 2일

프로그래머스 문제 정리

금과 은 운반하기

문제 설명

어느 왕국에 하나 이상의 도시들이 있습니다. 왕국의 왕은 새 도시를 짓기로 결정하였습니다. 해당 도시를 짓기 위해서는 도시를 짓는 장소에 금 a kg과 은 b kg이 전달되어야 합니다.

각 도시에는 번호가 매겨져 있는데, i번 도시에는 금 g[i] kg, 은 s[i] kg, 그리고 트럭 한 대가 있습니다. i번 도시의 트럭은 오직 새 도시를 짓는 건설 장소와 i번 도시만을 왕복할 수 있으며, 편도로 이동하는 데 t[i] 시간이 걸리고, 최대 w[i] kg 광물을 운반할 수 있습니다. (광물은 금과 은입니다. 즉, 금과 은을 동시에 운반할 수 있습니다.) 모든 트럭은 같은 도로를 여러 번 왕복할 수 있으며 연료는 무한대라고 가정합니다.

정수 ab와 정수 배열 gswt가 매개변수로 주어집니다. 주어진 정보를 바탕으로 각 도시의 트럭을 최적으로 운행했을 때, 새로운 도시를 건설하기 위해 금 a kg과 은 b kg을 전달할 수 있는 가장 빠른 시간을 구해 return 하도록 solution 함수를 완성해주세요.


제한사항

  • 0 ≤ ab ≤ 10^9
  • 1 ≤ g의 길이 = s의 길이 = w의 길이 = t의 길이 = 도시 개수 ≤ 10^5
    • 0 ≤ g[i]s[i] ≤ 10^9
    • 1 ≤ w[i] ≤ 10^2
    • 1 ≤ t[i] ≤ 10^6
    • a ≤ g의 모든 수의 합
    • b ≤ s의 모든 수의 합

solution.js

function solution(a, b, g, s, w, t) {
  let [start, end] = [0, 4 * 10e14];
  let mid = Math.floor((start + end) / 2);
  const totalVillage = g.length;

  while (start <= end) {
    let [gold, silver, resource] = [0, 0, 0];

    for (let i = 0; i < totalVillage; i++) {
      const remainResource = Math.round(mid / (2 * t[i]));
      const maxCarryingResource = remainResource * w[i];
      gold += Math.min(g[i], maxCarryingResource);
      silver += Math.min(s[i], maxCarryingResource);
      resource += Math.min(g[i] + s[i], maxCarryingResource);
    }

    if (gold >= a && silver >= b && resource >= a + b) {
      end = mid - 1;
    } else {
      start = mid + 1;
    }
    mid = Math.floor((start + end) / 2);
  }

  return start;
}

n^2 배열 자르기

문제 설명

정수 nleftright가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.

  1. n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
  2. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
    • 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
  3. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
  4. 새로운 1차원 배열을 arr이라 할 때, arr[left]arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.

정수 nleftright가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ n ≤ 10^7
  • 0 ≤ left ≤ right < n^2
  • right - left < 10^5

solution.js


function solution(n, left, right) {
    let answer = [];
    
    for (let i = left; i <= right; i++){
        answer.push(Math.max(Number.parseInt(i / n), i % n) + 1);
    }
    
    return answer;
}

0개의 댓글