728x90

✨ 제곱 값을 구하기 위해 사용하는 helper method

💻Example Code

const num = 2;

console.log( Math.pow(num, 2) );
console.log( Math.pow(num, 10) );
console.log( Math.pow(num, -2) );

실행 결과

🧨 2의 -2제곱은 1/4이므로, 0.25가 나온다.

😋 base^exponent라고 생각하면 된다.
base의 exponent제곱!

👉 자세한 내용은 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow

 

Math.pow()

The Math.pow() function returns the base to the exponent power, that is, baseexponent.

developer.mozilla.org

 

'JavaScript > Built-in Method etc.' 카테고리의 다른 글

Math.PI  (0) 2020.01.28
Array.prototype.forEach()  (0) 2020.01.23
Math.random()  (0) 2020.01.18
Math.ceil()  (0) 2020.01.18
Array.prototype.filter()  (0) 2020.01.11
728x90

https://www.acmicpc.net/problem/4948

Code

Solution 1
Solution 2 개선된 코드

😢 '에라토스테네스의 체'를 이용해서(1929번 문제) 구간만 잘 정해주면 된다.

😊 Solution 1)
마지막에 0을 받으면 끝나도록 while loop을 돌려줬다.
1929번 문제에서 M, N을 여기서는 n = 입력 받은 값, m = n * 2로 구간을 설정해줬다.
또한, 값을 판단하기 위해 선언하는 Array에서, 구간을 벗어나는 index에 false를 세팅해주고 시작하면 된다.
(0보다 크고 n보다 작거나 같을 때까지)

추가 Solution 2) 코드 개선
전체 입력을 반복하는 반복문은 for ... of로 대체하였으며, 첫 째 줄에 0을 받으면 break하도록 설정하였다.
n보다 크고 2n보다 작거나 같아야 하므로, 구간은 n+1부터 2n까지라고 보면 된다. 
따라서 n=num+1, m=2*num으로 구간을 선언해주었다.
마찬가지로, m+1만큼 Array를 선언해준 후 fill(true)로 채워줬다. (index 0과 1은 false로 채워줬다)
이제 에라토스테네스의 체 방법으로 소수를 구해주고, n부터 m까지 소수가 있다면 count 후 counter를 출력해줬다.

이렇게 3396ms에서 520ms로 속도를 개선할 수 있었다.

Full Code (https://github.com/DasolPark/Dasol_JS_Algorithm/tree/master/Baekjoon)

// 베르트랑 공준(Bertrand Gongjoon)
 
// 2nd Solution
 
// For submit
 
// const fs = require('fs');
// const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n').map(num => parseInt(num));
 
// For local test
const input = [1, 10, 13, 100, 1000, 10000, 100000, 0];
for (let num of input) {
if (num === 0) {
break;
}
 
const n = num + 1;
const m = 2 * num;
const isPrimeNumArr = new Array(m + 1);
let counter = 0;
 
isPrimeNumArr.fill(true);
isPrimeNumArr[0] = isPrimeNumArr[1] = false;
 
for (let i = 2; i <= m; i++) {
if (Math.pow(i, 2) > 1000000) {
break;
} else {
for (let square = Math.pow(i, 2); square <= m; square += i) {
isPrimeNumArr[square] = false;
}
}
}
 
for (let i = n; i <= m; i++) {
if (isPrimeNumArr[i]) {
counter++;
}
}
console.log(counter);
}
 
// 1st Solution
 
// For submit
 
// const fs = require('fs');
// const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n').map(num => parseInt(num));
 
// For local test
// const input = [1, 10, 13, 100, 1000, 10000, 100000, 0];
 
// while (true) {
// const n = input.shift();
// if (n === 0) {
// break;
// }
// let counter = 0;
// const m = 2 * n;
// const isPrimeArr = new Array(m + 1);
 
// isPrimeArr.fill(true);
// for (let i = 0; i <= n; i++) {
// isPrimeArr[i] = false;
// }
 
// for (let i = 2; i < m + 1; i++) {
// if (parseInt(Math.pow(i, 2) > m)) {
// break;
// } else {
// for (let square = parseInt(Math.pow(i, 2)); square < m + 1; square += i) {
// isPrimeArr[square] = false;
// }
// }
// }
 
// for (let i = 2; i < m + 1; i++) {
// if (isPrimeArr[i]) {
// counter++;
// }
// }
// console.log(counter);
// }
728x90

https://www.acmicpc.net/problem/1929

Code

최종 제출 코드

😢 원리를 이해하고 코드를 구현하는 데, 시간이 조금 걸렸다. 여러 자료도 참고했다.

😊 에라토스테네스의 체 방법으로 소수를 구하는 문제다.
소수를 구하면, 그 소수의 배수는 소수가 될 수 없다. 그래서 그 배수들을 사전에 제거하고 남은 수를 이용해 소수를 구하는 방법이다.

먼저, (1 ≤ M ≤ N ≤ 1,000,000)이므로 MAX를 선언해준다.
그리고 소수를 판단할 isPrimeArr(Array)를 N+1만큼 선언해준다(인덱스를 N까지 사용할 것이므로)
isPrimeArr는 .fill()을 이용해 모두 true값으로 세팅해줬다. 그리고 0과 1은 소수가 아니므로 false를 세팅해줬다.

for loop을 돌리면서 해당 소수의 배수는 false로 값을 바꿔준다. 그리고 조건문을 이용해 우리가 구할 숫자를 넘어가면 break;
내부 for loop에서 for조건문의 마지막을 넣지 않았는데, 그 안에 square += i를 넣어줘도 된다. 같은 의미다(배수를 계속 더해줌)

마지막에 입력 받은 구간만큼 for loop을 이용해 출력해주면 된다(isPrimeArr이 true면 소수)

아래 링크를 참고하면 이론과 함께 시각적으로 어떻게 진행되는지 볼 수 있어 좋다. 좋은 참고자료!

https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4

 

에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 수학에서 에라토스테네스의 체는 소수(소쑤)를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색) 자기 자신을 제외한 2의 배수를 모두 지운다. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초

ko.wikipedia.org

Full Code (https://github.com/DasolPark/Dasol_JS_Algorithm/tree/master/Baekjoon)

// Find Prime Number(에라토스테네스의 체)
 
// For submit
 
// const fs = require('fs');
// const input = fs.readFileSync('/dev/stdin').toString().trim().split(' ').map(num => parseInt(num));
 
// For local test
const input = [3, 16];
const MAX = 1000000;
let M = input.shift();
let N = input.shift();
let isPrimeArr = new Array(N + 1);
let square = 0;
 
isPrimeArr.fill(true);
isPrimeArr[0] = isPrimeArr[1] = false;
 
for (let i = 2; i < N + 1; i++) {
if (isPrimeArr[i]) {
if (parseInt(Math.pow(i, 2)) > MAX) {
break;
} else {
for (square = parseInt(Math.pow(i, 2)); square < N + 1; ) {
isPrimeArr[square] = false;
square += i;
}
}
}
}
 
for (let i = M; i < N + 1; i++) {
if (isPrimeArr[i]) {
console.log(i);
}
}
728x90

https://www.acmicpc.net/problem/2581

Code

최종 제출 코드

😢 기본 '소수 찾기'문제에서 조건을 조금 추가해주면 쉽게 해결되는 문제

😊 최솟값을 구해주기 위해 Array를, 소수값의 합을 구해주기 위해 sum 변수를 추가했다.
소수를 구하는 부분은 function으로 따로 빼주었으며,
function내에서 소수를 찾으면 arr에 push함과 동시에 소수들을 sum에 누적해 줬다.
그리고 마지막에 만약 Array.length가 없다면 소수는 없는 것이므로 -1을 출력하도록 했다.

Full Code (https://github.com/DasolPark/Dasol_JS_Algorithm/tree/master/Baekjoon)

// Prime Number(Sum and Min or -1)
 
// For submit
 
// const fs = require('fs');
// const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
 
// For local test
const input = ['64', '65'];
const primeNumArr = [];
let primeNumSum = 0;
 
function primeNumber(n) {
if (n < 2) {
return;
}
 
for (let i = 2; i < n; i++) {
if (n % i === 0) {
return;
}
}
primeNumArr.push(n);
primeNumSum += n;
}
 
const begin = parseInt(input.shift());
const end = parseInt(input.shift());
 
for (let i = begin; i <= end; i++) {
primeNumber(i);
}
 
if (!primeNumArr.length) {
console.log(-1);
} else {
console.log(primeNumSum);
console.log(Math.min.apply(null, primeNumArr));
}
728x90

https://www.acmicpc.net/problem/1978

Code

최종 제출 코드

😢 소수란? 1과 자기 자신만으로 나누어 떨어지는 1보다 큰 양의 정수.

😊 따로 function을 만들어서 풀었다.
0 또는 1은 소수가 아니므로 if(n < 2) 조건문을 걸어 return;했고,
2부터 자기 자신-1까지 나눠주면서 나머지가 0된다면 소수가 아니므로 return;
위의 조건에 모두 해당되지 않는다면, 해당 숫자는 소수이므로 counter++;

Full Code (https://github.com/DasolPark/Dasol_JS_Algorithm/tree/master/Baekjoon)

// Find Prime Number
 
// For submit
 
// const fs = require('fs');
// const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
 
// For local test
const input = ['4', '1 3 5 7'];
const T = parseInt(input.shift());
const numbers = input
.shift()
.split(' ')
.map(num => parseInt(num));
let counter = 0;
 
function primeNumber(n) {
if (n < 2) {
return;
}
 
for (let i = 2; i < n; i++) {
if (n % i === 0) {
return;
}
}
counter++;
}
 
for (let i = 0; i < T; i++) {
primeNumber(numbers[i]);
}
 
console.log(counter);
728x90

https://www.acmicpc.net/problem/10872

Code

최종 제출 코드

😢 0!은 1을 잊고 있었다. 0 팩토리얼은 1이다.

😊 간단한 재귀 문제다. 가장 중요한 건 0!을 처리해주는 것이다.
피보나치수열 재귀와 비슷하다. n이 1로 갈때까지 재귀를 실행해주고 return하며 1부터 input까지 값을 곱해간다.

Full Code (https://github.com/DasolPark/Dasol_JS_Algorithm/tree/master/Baekjoon)

// Factorial
 
// For submit
 
// const fs = require('fs');
// const input = parseInt(fs.readFileSync('/dev/stdin').toString().trim());
 
// For local test
const input = 0; // 10
 
function factorial(n) {
if (n === 0) {
// 0! === 1
return 1;
}
 
if (n < 2) {
return n;
}
 
return factorial(n - 1) * n;
}
 
console.log(factorial(input));
728x90

📳

Click! 👉 https://dasolpark.github.io/Dasol_CSS_WhatsApp_Clone/

 

Chats

Archived Chats 0 Broadcast Lists New Group

dasolpark.github.io

Github👉https://github.com/DasolPark/Dasol_CSS_WhatsApp_Clone

 

DasolPark/Dasol_CSS_WhatsApp_Clone

Let's make WhatsApp Design Clone with Responsive CSS - DasolPark/Dasol_CSS_WhatsApp_Clone

github.com

해외에서 많이 사용하는 메신저앱 WhatsApp의 디자인 패턴HTML CSS를 이용해 복제해 보았습니다.

📳모바일이나 💻데스크톱 등 어떤 브라우저에서도 디자인이 무너지지 않도록, 반응형 CSS를 적용하였으며,
JavaScript를 이용해 현재 시간 띄우기, 전화 목록 지우기, 채팅 메세지 등록을 간단히 구현해 보았습니다.

해당 프로젝트는 width:375, height:638 크기에 최적화되어 있습니다.

좌측 Status, 우측 Calls Page
좌측 Calls - Edit 기능, 우측 Calls - New Call Page
좌측 Chats, 우측 Chats - Chat Page
Settings Page

728x90

✨ 무작위(random)숫자를 얻기 위한 helper method

💻Example Code

const randomNum = Math.random();
const max = 3;

console.log( randomNum ); // 0 ~ 0.99999...
console.log( randomNum * max ); // 0 ~ 2.9999.....

위 코드를 3번 실행한 결과

기본적으로, Math.random()은 0 ~ 0.999...까지 값을 얻을 수 있다(1은 포함되지 않는다)
하지만, 위 코드처럼 max값을 곱해주면 0 ~ 2.999...까지 값을 얻을 수 있다(3은 포함되지 않는다)
이렇게 범위를 정해서 내가 원하는 random 값을 받아볼 수 있다.

📌 만약 1부터 3까지 값을 받고 싶다면?

Math.ceil( Math.random * 최대 범위 )
위와 같이 ceil(올림) method를 사용해주면 된다(여러가지 다른 방법도 있다)

console.log( Math.ceil(Math.random() * 3) );

위 코드를 3번 실행한 결과

📌 function을 사용하여 간편하게 이용하는 방법도 있다.

function getRandomInt(max){
return Math.floor( Math.random() * max ) + 1; }

const max = 3;

console.log( getRandomInt(max) );

위 코드를 3번 실행한 결과

위 function에서는 Math.floor( Math.random() * max ) + 1; 로 작성했다.
즉, 0 ~ 2.999...범위의 random 숫자를 버림(floor)해주고 +1을 더해 주는 방식이다.
이렇게 작성해도 1~3까지 범위의 random 숫자를 받아볼 수 있다.

😋 기본적으로 구구단 게임이라든지, 무언가 변칙적인 개발이 필요할 때 자주 사용되는 method!
종종 쓰이기 때문에, 한 번 잘 이해해두고 앞으로 쉽게 사용하자.

👉 자세한 내용은 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random

 

Math.random()

The Math.random() function returns a floating-point, pseudo-random number in the range 0–1 (inclusive of 0, but not 1) with approximately uniform distribution over that range — which you can then scale to your desired range. The implementation selects the

developer.mozilla.org

 

'JavaScript > Built-in Method etc.' 카테고리의 다른 글

Array.prototype.forEach()  (0) 2020.01.23
Math.pow()  (0) 2020.01.22
Math.ceil()  (0) 2020.01.18
Array.prototype.filter()  (0) 2020.01.11
Array.prototype.map()  (0) 2020.01.11
728x90

✨ '1.23'과 같이 소수점과 함께 있는 수를 올림 해주는 helper method

💻Example Code

const floatNum = 1.23;
const minFloatNum = -7.5;

console.log( Math.ceil(floatNum) );
console.log( Math.ceil(minFloatNum) );

실행 결과

😋 소수점 올림을하여 정수(Integer)가 필요할 때, 편리하게 사용할 수 있다. 자주 쓰이는 method.

👉 자세한 내용은 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/ceil

 

Math.ceil()

The Math.ceil() function always rounds a number up to the next largest whole number or integer.

developer.mozilla.org

 

'JavaScript > Built-in Method etc.' 카테고리의 다른 글

Math.pow()  (0) 2020.01.22
Math.random()  (0) 2020.01.18
Array.prototype.filter()  (0) 2020.01.11
Array.prototype.map()  (0) 2020.01.11
Array.prototype.push()  (0) 2020.01.06
728x90

https://www.acmicpc.net/problem/2775

Code

최종 제출 코드

😢 이런 저런 패턴이 많이 보여서, 어떤 패턴으로 접근할 지 고민을 많이 했다.

😊 문제의 의도는 a-1층의 1호부터 b호까지 모두 더하라는 것이 아닐 것이다. 물론 더해도 된다. 하지만 시간이 오래 걸린다.

1 6 21 56 126
1 5 15 35 70
1 4 10 20 35
1 3 6 10 15
1 2 3 4 5

예를 들기 위해, 4층, 1-5호까지 있는 아파트를 표로 작성해봤다(참고로 층은 0부터 시작한다)
어떤 패턴이 있는지 잘 살펴보면, [a행, b열]에 있는 값은 [a행, b-1열] + [a-1행, b열]의 값으로 이루어져 있다.

또한, 가장 아래 행의 각 열은 1부터 b까지 1씩 순차적으로 증가하는 값을 가지며, 왼쪽의 첫 번째 열은 항상 1 값만 갖는다.

입력으로 a=2, b=3을 받았다고 가정해보자
[2, 2] == 4, [1, 3] == 6이라는 것을 알 수 있고, 이 값을 더하면 4+6=10. 곧, [2, 3]의 값이다.
이 패턴을 가지고 코드를 작성해보면 위의 코드가 나온다.

외부 for loop에서 배열을 항상 [1]부터 시작하도록 초기화해준다.
내부 for loop에서는 가장 아래 행이면 1씩 증가하도록 if 조건문을 걸어주고,
그 외 경우는 위의 [a행, b-1열] + [a-1행, b열] 패턴에 맞도록 값을 저장해준다.
그리고 마지막에 알고 싶은 층과 호수배열의 인덱스에 넣고 찾아주면 된다.

Full Code (https://github.com/DasolPark/Dasol_JS_Algorithm/tree/master/Baekjoon)

 
// I'll be the president of the women's association
 
// 2nd Solution - Good
 
// For submit
 
// const fs = require('fs');
// const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n').map(num => Number(num));
 
// For local test
const input = [2, 1, 3, 2, 3];
const T = input.shift();
 
for (let i = 0; i < T; i++) {
const a = input.shift();
const b = input.shift();
const apartment = [];
 
for (let i = 0; i <= a; i++) {
apartment.push([1]);
for (let j = 1; j < b; j++) {
if (i === 0) {
apartment[i].push(j + 1);
} else {
apartment[i].push(apartment[i][j - 1] + apartment[i - 1][j]);
}
}
}
 
const floor = a;
const room = b - 1;
console.log(apartment[floor][room]);
}
 

+ Recent posts