/**
* 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();
});
최초에는 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();
});
/**
* 반복되는것을 찾아보면 일단
* 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();
});
/**
* 주의할 것
* 매일을 시뮬레이션 돌릴 필요 없다는 것
* 탈출 이후에는 미끄러져서 내려갈필요 없다는 것
*/
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();
});
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();
});
/**
* 각 층의 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();
});
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();
});
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();
});
/**
* 문제 자체가 이해가 안가서 찾아보다가 정답을 봐가지고 본 정답대로 풀었음
* 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();
});