1. 1712번 - 손익분기점

/**
 * x => 손익분기점
 * 고정비용 + 가변비용*x < 수익*x
 * 고정비용 / ( 수익 - 가변비용 ) < x
 */

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = null;
let fixedCost = 0;
let variableCost = 0;
let revenue = 0;

rl.on("line", line => {
  input = line.split(" ");
  fixedCost = +input[0];
  variableCost = +input[1];
  revenue = +input[2];

  rl.close();
}).on("close", () => {
  let answer = null;
  // 팔았을 때 이득이 0이거나 음수값이면 손익분기점이 존재할 수 없음
  if (revenue - variableCost <= 0) {
    answer = -1;
  } else {
    answer = fixedCost / (revenue - variableCost);
    answer = Number.isInteger(answer) ? answer + 1 : Math.ceil(answer);
  }

  console.log(answer);

  process.exit();
});

2. 2292번 - 벌집

최초에는 calculate()를 재귀호출했지만, 대충 십억번 정도 이상으로 넘어가면
RangeError: Maximum call stack size exceeded가 발생하기 때문에 while문으로 대체

/**
 * 1 => 1개 => 1개
 * 2~7 => 2개 => 6개
 * 6~19 => 3개 => 12개
 * 20~37 => 4개 => 18개
 * 위와 같은 반복이 존재함
 *
 * 1을 제외하고 등차수열
 */

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = null;
let count = 1;
let maxDistance = 1; // 최단거리에 해당하는 최댓값
let difference = 6; // 공차
let calculate = () => {
  // 해당 카운트의 최댓값을 구함... 즉, 최단거리 2일때 => 7, 최단거리 3일때 19 이런식으로
  maxDistance += difference * count;

  // 반복시 마다 count + 1
  count++;

  // (현재 최단거리 - 입력값) < 0 이면 다음 최단거리계산
  if (maxDistance - input < 0) return true;
  return false;
};

rl.on("line", line => {
  input = +line;

  rl.close();
}).on("close", () => {
  if (input === 1) answer = 1;
  else {
    while (calculate());
  }

  console.log(count);

  process.exit();
});

3. 1193번 - 분수찾기

/**
 * 반복되는것을 찾아보면 일단
 * 1 => 1/1           1번
 * 2 => 1/2 2/1       2번
 * 3 => 1/3 2/2 3/1   3번
 * 의 반복으로 즉, 각 숫자만큼만 반복됨
 *
 * 그렇다면 특정 숫자를 입력받을 때 해당 숫자가 몇 번째인지 구하고, 그 숫자가 내부에서 몇 번째 인지만 구하면 쉽게 구할 수 있음
 * 예를 들면 9면 4번째중에 3번째, 12면 5번째중에 2번째... 이런식으로
 *
 * 그럼 외부 몇 번째(이후 outerTarget) 인지 구하려면 주어진 숫자(이후 input)이 1부터 어디까지의 합 내부에 속하는지 구해야함 ( outerTargetCalculate()에서 구함 )
 * outerTarget를 구했다면 내부에서 몇 번째(이후 innerTarget) 인지 구할려면 [1부터 outerTarget까지의 합 - input]을 하면 innerTarget이 구해짐
 *
 * 그러면 최종적으로 input이 outerTarget번째중에 innerTarget번째에 속한다는 것을 알게되고 그 이후에 분자/분모를 구하면 끝
 */

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = null;
// 1~N까지 합을 구하는 함수
const sumCalculate = number => (number * (number + 1)) / 2;

// 1 ~ N까지 합중에 N을 의미함... 10일경우 1~4까지 합 이하이므로 4, 14인경우 1~5까지 합 이하이므로 5
let outerTarget = 1;
const outerTargetCalculate = () => {
  let temp = sumCalculate(outerTarget);

  if (input > temp) {
    outerTarget++;
    outerTargetCalculate();
  }
};

rl.on("line", line => {
  input = +line;

  rl.close();
}).on("close", () => {
  outerTargetCalculate();

  // 어느 숫자중에서 몇 번째인지
  // =outerTarget  =innerTarget
  const innerTarget = outerTarget - (sumCalculate(outerTarget) - input);

  const top = outerTarget - innerTarget + 1;
  const bottom = outerTarget - top + 1;
  const answer = outerTarget % 2 === 0 ? `${bottom}/${top}` : `${top}/${bottom}`;

  console.log(answer);

  process.exit();
});

4. 2869번 - 달팽이는 올라가고 싶다

/**
 * 주의할 것
 * 매일을 시뮬레이션 돌릴 필요 없다는 것
 * 탈출 이후에는 미끄러져서 내려갈필요 없다는 것
 */

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = null;
let up = 0;
let down = 0;
let total = 0;

rl.on("line", line => {
  input = line.split(" ");
  up = +input[0];
  down = +input[1];
  total = +input[2];

  rl.close();
}).on("close", () => {
  console.log(Math.ceil((total - down) / (up - down)));

  process.exit();
});

5. 10250번 - ACM 호텔

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = [];
let width = 0;
let height = 0;
let number = 0;
let floorNumber = 1;
let roomNumber = 1;

rl.on("line", line => {
  input.push(line);

  if (input.length >= 2 && input.length - 1 === +input[0]) rl.close();
}).on("close", () => {
  input.shift();
  let answer = "";

  input.forEach(value => {
    const temp = value.split(" ");
    height = +temp[0];
    width = +temp[1];
    number = +temp[2];

    floorNumber = number % height === 0 ? height : number % height;
    roomNumber = Math.ceil(number / height);
    roomNumber = roomNumber >= 10 ? roomNumber : "0" + roomNumber;

    answer += `${floorNumber}${roomNumber}\n`;
  });

  console.log(answer);

  process.exit();
});

6. 2775번 - 부녀회장이 될테야

/**
 * 각 층의 1호와 0층을 제외하고는 (앞호 + 아래층)이라는 공식을 만족함
 */

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = [];
let maxFloorNumber = 0;
let maxRoomNumber = 0;

rl.on("line", line => {
  input.push(+line);

  if (input.length >= 2 && input.length - 1 === input[0] * 2) rl.close();
}).on("close", () => {
  input.shift();
  let answer = "";

  // 이차원 배열형태로 변환 => [1, 3, 2, 3] => [[1, 3], [2, 3]]
  let output = [];
  let tempLength = input.length / 2;
  for (let i = 0; i < tempLength; i++) {
    let tempArray = [];
    for (let j = 0; j < 2; j++) {
      tempArray.push(input.shift());
    }
    output.push(tempArray);
  }

  // 구해야하는것중에 제일 큰값만 구하기... 나중에 연산을 최소화하기 위해서
  // 공식을 보면 어차피 앞호와 아래층의 인원수를 계산해야하기 때문에 최소한의 연산을 하기위해서
  [maxFloorNumber, maxRoomNumber] = output.reduce((prev, curr) => {
    const tempArray = [];

    // 층수가 제일 높은놈 찾기
    if (prev[0] >= curr[0]) tempArray.push(prev[0]);
    else if (prev[0] < curr[0]) tempArray.push(curr[0]);

    // 호수가 제일 높은놈 찾기
    if (prev[1] >= curr[1]) tempArray.push(prev[1]);
    else if (prev[1] < curr[1]) tempArray.push(curr[1]);

    return tempArray;
  });

  // 최대층과 최대호수에 맞게 2차원 배열 생성 ( + 0층에 각 인원수만큼 초기화 )
  const apartment = Array(maxFloorNumber + 1)
    .fill()
    .map((value, index) =>
      Array(maxRoomNumber)
        .fill()
        .map((v, i) => (index === 0 ? i + 1 : 0)),
    );

  // 각 층의 1호는 1명으로 초기화
  apartment.forEach((value, index) => value.forEach((v, i) => (i === 0 ? (apartment[index][0] = 1) : null)));

  // 각층, 호마다 해당 인원 넣음
  apartment.forEach((value, index) => {
    // 0층 제외
    if (index === 0) return;

    value.forEach((v, i) => {
      // 각층의 1호 제외
      if (i === 0) return;

      // 아래층 + 앞호
      apartment[index][i] = apartment[index - 1][i] + apartment[index][i - 1];
    });
  });

  output.forEach(v => (answer += `${apartment[v[0]][v[1] - 1]}\n`));

  console.log(answer);

  process.exit();
});

7. 2839번 - 설탕 배달

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = [];

rl.on("line", line => {
  input = +line;

  rl.close();
}).on("close", () => {
  let answer = "";
  let n = 0;
  let x = 0;
  let y = 0;

  n = Math.floor(input / 5);

  for (let i = 0; i <= n; i++) {
    if ((input - i * 5) % 3 === 0) {
      x = i; // 5봉지 개수
      y = (input - i * 5) / 3; // 3봉지 개수
    }
  }

  answer = x + y === 0 ? -1 : x + y;

  console.log(answer);

  process.exit();
});

8. 10757번 - 큰 수 A+B

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = null;

rl.on("line", line => {
  input = line;

  rl.close();
}).on("close", () => {
  let answer = "";

  answer = input.split(" ").reduce((prev, curr) => BigInt(prev) + BigInt(curr));

  console.log(answer + "");

  process.exit();
});

9. 1011번 - Fly me to the Alpha Cetauri

/**
 * 문제 자체가 이해가 안가서 찾아보다가 정답을 봐가지고 본 정답대로 풀었음
 * 1 => 1
 * 2 => 1 1
 * 3 => 1 1 1
 * 4 => 1 2 1
 * 5 => 1 2 1 1
 * 6 => 1 2 2 1
 * 7 => 1 2 2 1 1
 * 8 => 1 2 2 2 1
 * 9 => 1 2 3 2 1
 * 10 => 1 2 3 2 1 1
 * ...
 *
 * a => 거리의 제곱근
 * b => Math.round(거리의 제곱근)
 * ## 횟수
 * b >= a => b * 2 - 1
 * b < a => b * 2
 */

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = [];

rl.on("line", line => {
  input.push(line);

  if (input.length >= 2 && input.length - 1 === +input[0]) rl.close();
}).on("close", () => {
  input.shift();
  let answer = "";

  input.forEach(v => {
    const x = +v.split(" ")[0];
    const y = +v.split(" ")[1];
    const distance = y - x;
    const a = Math.sqrt(distance);
    const b = Math.round(Math.sqrt(distance));

    const moveCount = a <= b ? b * 2 - 1 : b * 2;

    answer += `${moveCount}\n`;
  });

  console.log(answer);

  process.exit();
});

0개의 댓글