Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- border radius
- 백준 정리
- git 버전관리
- 생활코딩
- 생활코딩 WEB2-JavaScript
- li 태그
- 크롬웹
- 드림코딩
- error: ENOENT: no such file or directory
- max-width
- 코딩테스트
- Pull
- box-sizing: border-box
- nav태그
- 노마드 코더
- margin 0 auto
- 단계별로 풀어보기
- 라매개발자
- 백준 자바스크립트
- 백준
- :root
- 할만한데?
- git
- 나도코딩
- 나도코딩 파이썬
- calc()
- html 끝
- WEB2-JavaScript
- HTML
- button:focus cursor: pointer; outline: none;
Archives
- Today
- Total
코딩응애의 개발블로그
[JS] 백준 단계별로 풀어보기 ( 기본 수학 1) 본문
백준 1712번
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(__dirname + '/input.txt').toString().split('\n');
input = input[0].split(' ').map(value => +value);
solution(input[0], input[1], input[2]);
function solution(A, B, C) {
if (C-B <= 0) {
console.log(-1);
}
else {
let N = A / (C - B);
let sell = Math.floor(N) + 1;
console.log(sell);
}
}
반복문을 이용해서 풀려다가 도저히 모르겠어서 답을 봤는데 반복문을 이용하는게 아니었다.
그냥 식을 이용해서 푸는것이었음.
여기서 손익분기점이 A+B < C 가 되는 순간인데 A는 고정비용이니 그대로 두고 나머지 B,C는 노트북 판매대수가
늘때마다 곱해줘야 하니까 A+(Bxn) < (Cxn) 이라고 식을 가정하면 A < (Cxn) - (Bxn) , A < n(C-B) 여기서
고정비용(A)에서 (C-B)를 나눈값에 플러스 1한게 판매대수인데 결과값이 실수가 나올수 있기에 Math.floor() 함수를
이용해야 한다.
포인트는 노트북 가격(C)에서 가변비용(B)을 뺏을때 음수나 0이 나온다면 A에 나눌 수가 없으니까 손익분기점이 안생긴다는 것을 이용해서 풀어야 한다.
백준 2292번
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(__dirname + '/input.txt').toString().split('\n');
solution(+input[0]);
function solution(N) {
let sum = 1;
let i = 1;
while (sum < N) {
sum = sum + (6*i);
i++
}
console.log(i);
}
처음에 도저히 못풀겠어서 다른 사람들 풀이를 봤는데 그래도 이해가 안가서 며칠 후 다시 보고 나서야 겨우 이해한 문제 사람들이 6의 배수로 늘어난 다는 말이 이해가 안됬었는데 그건 감싸고 있는 숫자들 개수를 뜻하는 것이였다.
무슨 말이냐면 1을 감싸고 있는 숫자는 2-7로 6개고 2-7을 감싸고 있는 숫자들은 8-19로 12개 8-19를 감싸고 있는 숫자들은 20-37로 18개 즉 이런식으로 6개씩 늘어난다는 의미이다.
이러한 특징을 이용해서 주어진 숫자까지 갈때 최소 방의 개수는 우선 첫 출발인 1을 포함하고 한칸 갈때 6증가한다고 가정하고 식을 세우면 저러한 식이 된다. 이 과정을 주어진 숫자보다 작을때 까지 반복하면 끝이다.
백준 2869번
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(__dirname + '/input.txt').toString().split('\n');
input = input[0].split(' ').map(value => +value);
solution(input[0], input[1], input[2]);
function solution(A, B, V) {
console.log(Math.ceil((V-B)/(A-B)));
}
처음에는 낮에 올라가는 미터 빼기 밤에 내려가는 미터 해서 총 높이에서 나누기 했는데 이렇게 하면 안된다.
왜냐면 정상에 도착하면 미끄러지지 않기 때문에 이런식으로 하면 정상에 도착해도 미끄러 져서 원하는 값을 얻을수가 없다.
따라서 아예 기존에 올라가야 하는 높이에서 미끄러지는 미터를 뺀 높이를 기준으로 계산을 하면 된다.
왜냐면 달팽이가 목표 지점에 도달한 날에는 미끄러지는 것을 감안하면 안 되니 총 v-b 미터를 올라가게 되는 것과 같기 때문이다.
(이거 이해하는 너무 오래걸림 왜 v-b일까 이 부분이 계속 이해가 안갔었는데 다른 사람들 설명하는거 보다가 딱 이해되는 문장이 보여서 이해가 됨)
(v-b)/(a-b) 해주면 되는데 여기서 소수점이 나온다면 하루가 더 걸린다는 의미이므로 올림 함수인 Math.ceil() 함수를 이용을 해준다.
백준 10250번
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(__dirname + '/input.txt').toString().split('\n');
const testcaseArray = [];
for (let i = 1; i <= +input[0]; i++) {
const hotelValue = input[i].split(' ').map(value => +value);
testcaseArray.push({ H: hotelValue[0], W: hotelValue[1], N: hotelValue[2] })
}
solution(+input[0], testcaseArray);
function solution(T, testcaseArray) {
for (let i = 0; i < T; i++) {
let Hotel = testcaseArray[i].H;
// const Wall = testcaseArray[i].W;
let Num = testcaseArray[i].N;
let room = 1;
while (Num > Hotel) {
room++;
Num = Num - Hotel;
}
if (room < 10) {
console.log(`${Num}0${room}`);
}
else {
console.log(`${Num}${room}`);
}
}
}
순서대로 채워 진다는점을 이용해서 n번째 사람이 h층보다 더 많으면 n-h를 해서 나온 값이 층수이고
호수는 n-h를 반복문에 넣어서 한번했다 가정하면 호수는 자연스레 02가 되는것이다
따라서 ++ 해주면 자연스레 호수가 나온다.
드디어 뭐가 문제인지 해결이 됬다. for (let i = 1; i <= +input[0].length; i++) 이 부분에서
+input[0] 이 "3" 같은 숫자 문자열인데 거기서 .length를 붙여서 계속 오류가 났던 것이었다.
ㅠㅠ 다시 제출 해보니 바로 통과! 뭔가 오류가 있을때는 천천히 한줄한줄 코드를 읽어보자
백준 2839번
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(__dirname + '/input.txt').toString().split('\n');
solution(+input[0]);
function solution(N) {
let cnt = 0;
while (N > 0) {
if (N % 5 === 0) {
N = N - 5;
cnt++;
}
else if (N % 3 === 0) {
N = N - 3;
cnt++;
}
else if (N > 5) {
N = N - 5;
cnt++;
}
else {
cnt = -1;
break;
}
}
console.log(cnt);
}
쉬운 문제 인줄 알았지만 결국엔 또 답보고 해결한 문제.
처음에는 5로 나누고 3으로 나눠서 해결할려다가 그렇게 되면 풀이가 안되서 while문을 이용해서 5로 일단 나누고
남은건 3으로 나눠서 그때마다 카운트 세서 해결한 문제이다.
백준 10757번
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(__dirname + '/input.txt').toString().split('\n');
input = input[0].split(' ');
solution(input[0],input[1]);
function solution(A,B) {
A = BigInt(input[0]);
B = BigInt(input[1]);
let ans = A+B;
console.log(ans.toString());
}
BigInt라는 것을 이용을 해야 한다 숫자가 너무 크기 때문에
여기서 BigInt란 Number 원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는
내장 객체이다..
다시 말해 길이의 제약 없이 정수를 다룰 수 있게 해주는 숫자형.
정수 리터럴 끝에 n을 붙이거나 함수 BigInt를 호출하면 문자열이나 숫자를 가지고 BigInt 타입의 값을 만들 수 있다.
toString() -> 숫자 타입을 문자타입으로 변경.
이걸 써주는 이유는 출력할때 n이 붙은채로 출력되면 오류가 발생했으므로 toStiring을 써줬다.
'알고리즘 문제' 카테고리의 다른 글
코딩 테스트 대비 4주 챌린지 JS (백준 2557, 1000, 2558, 10950, 10951, 10952) (0) | 2022.05.10 |
---|---|
[JS] 백준 2775번 (0) | 2022.03.15 |
[JS] 백준 단계별로 풀어보기(if문 2525번)vol.2 (0) | 2022.03.07 |
[JS] 백준 단계별로 풀어보기 (입출력과 사칙연산 1000번, 2588번) vol.2 (0) | 2022.03.03 |
[JS] 백준 단계별로 풀어보기 (while문), 10951 trim() (0) | 2022.01.25 |
Comments