728x90

✨number 의 부호를 알아내기 위한 helper method

기본적으로 양수(positive) 또는 음수(negative) 1을 반환하며(+/- 1), 괄호 안에 0을 넣는다면 +/- 0을 반환한다.
(양수는 +로 표기하지 않고 생략한다)
Reverse Int(숫자 거꾸로 바꾸기) Algorithm에서 유용하게 사용했다.
(number를 string으로 바꿔 다루는 경우, 최종값은 number로 반환해야 하기 때문에 부호를 되찾을 때 사용한다)

💻Example Code

const num = -24;

console.log( Math.sign(num) );

실행 결과 (-1)

😋 Reverse Int algorithm을 다룰 때, test case로 주어진 number값을 string으로 변환 후 순서를 뒤바꿔 줘야한다.
따라서, 마지막 결과값을 return 해줄 때, Math.sign(test case값)을 곱해주면 본래의 부호를 손쉽게 다시 되찾을 수 있다.

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

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

Number.prototype.toString()  (0) 2019.12.24
Global.parseInt()  (0) 2019.12.24
Array.prototype.slice()  (0) 2019.12.23
Math.floor()  (0) 2019.12.23
Number.prototype.toFixed()  (0) 2019.12.22
728x90

Q. 주어진 string의 회문 구조를 파악하고, 맞으면 true 틀리면 false를 return하라.

--- Examples
palindrome("abba") === true
palindrome("abcdefg") === false

Code

https://github.com/DasolPark/Algorithm_DataStructure_JavaScript-Stephen-/commit/efd69d6b976fab583958556518cf5b3162275d67
https://github.com/DasolPark/Algorithm_DataStructure_JavaScript-Stephen-/commit/efd69d6b976fab583958556518cf5b3162275d67

😢 reverse int and string에서 배웠던 Skill로도 충분했지만, 다른 방법을 적용해보고 싶었다.

😊 every()를 이용하여 주어진 string argument를 검사하는 방식을 배울 수 있었다.

✔ Array.prototype.every()

every() 괄호 안에 test function을 작성하여, 해당 array값을 이용해 test할 수 있다.
위의 소스코드에서는 char === str[str.length - i - 1]을 이용하여 맨 앞과 맨 뒤의 값을 하나씩 이동하며 비교하였다.
자세한 every() 사용법은 helper methods category에서 다루도록 하겠다.

Full Code

function palindrome(str) {
return str.split('').every((char, i) => {
return char === str[str.length - i - 1];
});
}
 
// function palindrome(str) {
// let reversed = str
// .split('')
// .reverse()
// .join();
// return str === reversed;
// }
728x90

Q. 주어진 integer를 정반대로 뒤바꾸고 return하라.

--- Examples
reverseInt(15) === 51
reverseInt(981) === 189
reverseInt(500) === 5
reverseInt(-15) === -51
reverseInt(-90) === -9

Code

https://github.com/DasolPark/Algorithm_DataStructure_JavaScript-Stephen-/commit/ccd99f2e87c5836d5e0b22793caf882e652d9529
https://github.com/DasolPark/Algorithm_DataStructure_JavaScript-Stephen-/commit/ccd99f2e87c5836d5e0b22793caf882e652d9529
https://github.com/DasolPark/Algorithm_DataStructure_JavaScript-Stephen-/commit/ccd99f2e87c5836d5e0b22793caf882e652d9529

😢 정반대로 바꾸는 것은 문제가 없었으나, 부호를 살리는 것과 다시 num type 으로 바꾸는 것에 대해서 어떻게 효율적으로 코드를 작성할 수 있을지 조금 고민을 했다.

😊 Math.sign()을 이용해 깔끔하게 부호를 살릴 수 있었고, Reverse String에서 쓰던 Skill들을 그대로 사용하였다.
그 외에 추가된 Skill은 toString(), parseInt()가 있다.

✔ Math.sign()

Math.sign()를 이용해 해당 변수의 부호를 알아내고 활용할 수 있다.
위의 소스코드에서 보면 알 수 있듯, arguments로 들어오는 n의 부호를 마지막에 곱해주어 해당 -(negative)를 다시 살려주었다.

✔ Number.prototype.toString()

처음에 들어오는 arguments가 number type이므로 reverse()를 이용할 것이라면 toString()으로 반드시 변환해줘야 한다.
그리고 reverse()를 사용하기 전에 split()사용하여 array로 반드시 변환해줘야 한다. Array.prototype.reverse()이기 때문이다.

✔ Global.parseInt()

string과 array를 이용해 number를 뒤바꾸어 주었으니, 최종값은 parseInt()를 이용해 number type으로 변환해야 한다.

Full Code

function reverseInt(n) {
let reversed = n
.toString()
.split('')
.reverse()
.join('');
return parseInt(reversed) * Math.sign(n);
}
 
// function reverseInt(n) {
// let rev = '';
 
// for (let num of n.toString()) {
// rev = num + rev;
// }
 
// return Math.sign(n) * parseInt(rev);
// }
 
// function reverseInt(n) {
// return (
// Math.sign(n) *
// parseInt(
// n
// .toString()
// .split('')
// .reduce((rev, num) => (rev = num + rev))
// )
// );
// }
728x90

✨ 배열(array)을 원하는 크기 만큼 자르고 싶을 때 사용하는 helper method(원래 값은 유지되며, copy개념이다)
(e.g., arr.slice(0,2)) 왼쪽처럼 시작(0), 끝(2) index를 지정해주면, array의 0부터 1 index까지 값을 얻어낼 수 있다.
slice( '시작', '여기 바로 앞까지' )으로 기억해주면 편하다.
Capitalize, Chunk and Merge Sort Algorithm 에서 유용하게 사용하였다.

💻Example Code

const arr = [ 1, 2, 3, 4, 5 ];

console.log( arr.slice(0,2) );

실행 결과(0부터 1 index까지 출력)

😋 자주 사용하지 않다가 사용하면, 어디까지 array가 잘리는지 헷갈리기 쉬운 helper method이다.

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

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

Global.parseInt()  (0) 2019.12.24
Math.sign()  (0) 2019.12.24
Math.floor()  (0) 2019.12.23
Number.prototype.toFixed()  (0) 2019.12.22
Function.prototype.apply()  (0) 2019.12.22
728x90

✨ 소수점 이하를 버리기 위한 Math의 helper method

(e.g., Math.floor(arr.length/2)) arr.length === 5 라고 가정할 때, 2라는 값을 도출할 수 있다.
Pyramid and Merge Sort Algorithm 등 여러곳에서 유용하게 사용했다.
(주로 array의 중간(midpoint or center)지점을 찾을 때 사용해왔으며, 그 외에도 다양한 곳에서 자주 사용된다)

💻Example Code

const arr = [1, 2, 3, 4, 5];

console.log( Math.floor(arr/2) );

실행 결과(2.5에서 소수점 이하를 버리고 2 출력)

😋 array의 index는 기본적으로 0부터 시작하기 때문에 홀수 개수의 array가 있을 때 center를 찾기에 유용하다.
특히, Array.prototype.slice() 와 연계하여 사용할 때 편하다. slice(begin index, End index) 형식으로 array(0,2)처럼 array를 자른다면, 0부터 1까지 index의 값만 slice 되기 때문이다.

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

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

Math.sign()  (0) 2019.12.24
Array.prototype.slice()  (0) 2019.12.23
Number.prototype.toFixed()  (0) 2019.12.22
Function.prototype.apply()  (0) 2019.12.22
String.prototype.split()  (0) 2019.12.22
728x90

✨ 소수점을 표시하기 위한 helper method

(e.g., 숫자변수.toFixed(2)) 왼쪽처럼 숫자값이 들어있는 변수에 toFixed(2)를 이용해주면 소수점 아래 2번째 값까지 표시가 가능하다.
기본적으로 JavaScript의 숫자는 Number로 통합되어 관리되고 표시되지만, int가 아니며 floating  point 속성을 가지고 있다.
(값의 통일성을 위해 의도적으로 소수점을 맞추고 싶을 때 유용할 것 같다. default는 반올림(round)이다)

 

💻Example Code

const num = 10.567

console.log(num.toFixed(2));

실행 결과 (10.567의 소수점 아래 2번째에서 반올림되어 1.57 출력)

😋 아직 어딘가에서 사용해보지는 않았지만, 백준 Algorithm을 풀면서 출력 형식을 똑같이 맞춰줘야하나?
생각하며 검색하다가 찾은 helper method이다. 언젠가는 분명 사용할 일이 있을 것 같다.

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

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

Array.prototype.slice()  (0) 2019.12.23
Math.floor()  (0) 2019.12.23
Function.prototype.apply()  (0) 2019.12.22
String.prototype.split()  (0) 2019.12.22
String.prototype.trim()  (0) 2019.12.22
728x90

백준 1546번: 평균(New average)(https://www.acmicpc.net/problem/1546)

Code

https://github.com/DasolPark/Algorithm_JavaScript/commit/1b5c7ef837e647f988486adb3b3656a9cd9df9eb

😢 역시 쉬운 문제라 내 방식대로 금방 풀었지만, 백준 형식에 맞지 않는 것인지 계속 '틀렸습니다'가 출력되었다.
이렇게 저렇게 한 10번은 바꿔보았지만, 틀린 이유를 찾지 못했다. 생각날 때마다 시도해봐야겠다. (위의 코드는 정답 코드)

😊 이번 문제에서 Function.prototype.apply()와 Number.prototype.toFixed()를 학습할 수 있었다.

Function.prototype.apply() 관련
최대값을 구하기 위해서 주로 3가지 방법을 사용했었다.
1. 적은 수의 값들에서 Max를 구할 때는 'Math.max(values...)
2. classic for loop을 이용하여 하나씩 비교하여 최종 Max값을 구하는 방법
3. 백준에서는 적용되지 않지만, Math.max(...values)처럼 ES2015 'Spread'사용하여 구하는 방법

하지만, 위의 13번째 code인 Math.max.apply(null, grades) 를 이용하면 보다 쉽게 max를 구할 수 있다.
간단히 설명하자면, 두 번째 arguments에 array(or an array-like object)를 넣어주면 된다.

Number.prototype.toFixed()
위의 helper method를 이용해 소수점 아래의 수를 표시할 수 있다. (e.g., toFixed(2)는 소수점 아래 2번째까지 출력)

Full Code

// 3rd Solution (submitted)
 
// For Submit
// const input = require('fs')
// .readFileSync('/dev/stdin')
// .toString()
// .split('\n');
 
// For local Test
const input = ['3', '10 20 30'];
const N = parseInt(input[0]);
const grades = input[1].split(' ');
const max = Math.max.apply(null, grades);
let sumNewGrades = 0;
 
for (var i = 0; i < grades.length; i++) {
sumNewGrades += (grades[i] / max) * 100;
}
 
console.log(sumNewGrades / N);
 
// 2nd Solution (Wrong only in baekjoon)
 
// For local test
 
// const input = ['3', '10 20 30'];
// const N = parseInt(input[0]);
// const grades = input[1].split(' ').map(num => {
// return (num = parseInt(num));
// });
// const newGrades = [];
// let max = 0;
// let sumNewGrades = 0;
// let result = 0;
 
// for (let i = 1; i < N; i++) {
// if (grades[i] > max) {
// max = grades[i];
// }
// }
 
// for (let grade of grades) {
// newGrades.push((grade / max) * 100);
// }
 
// for (let grade of newGrades) {
// sumNewGrades += grade;
// }
 
// result = sumNewGrades / newGrades.length;
 
// console.log(result.toFixed(2));
 
// 1st Solution (Spread - ES2015) (Wrong only in baekjoon)
 
// For local test
 
// const input = ['3', '40 80 60'];
// const N = parseInt(input[0]);
// const grades = input[1].split(' ').map(num => (num = parseInt(num)));
// const max = Math.max(...grades);
// const newGrades = [];
// let result = 0;
 
// for (let grade of grades) {
// newGrades.push((grade / max) * 100);
// }
 
// for (let grade of newGrades) {
// result += grade;
// }
 
// console.log(result / grades.length);
728x90

백준 3052번: 나머지(https://www.acmicpc.net/problem/3052)

Code

https://github.com/DasolPark/Algorithm_JavaScript/commit/293abe528c7ebc870d22b8acbab901c873dffbf4

😢 쉬운 문제였기 때문에 금방 풀었으나, 문제는 뜻밖의 부분에 있었다.
값을 읽어올 때, trim()을 적용시켜주지 않아서, 마지막 공백 ''이 들어왔기 때문이다.
그래서 ''%42=0이 되어버렸고, theRestMap Object key값 0의 값이 1만큼 올라갔다.
따라서, 결과값이 항상 1만큼 더 높게 나와 '틀렸습니다' 결과를 받았다.

😊 Object를 하나 선언해주고, for of loop을 이용해 해당 나머지값(key)이 중복될 때마다 값(value)를 1씩 증가해준다.
그런 후 마지막에 Object.keys(theRestMap).length 를 출력하여 key의 개수(길이)만큼 출력하면 그것이 나머지의 개수다.

Full Code

// 2nd Solution
 
// For submit
 
// const fs = require('fs');
// const input = fs
// .readFileSync('/dev/stdin')
// .toString()
// .trim()
// .split('\n');
 
// For local test
 
const input = ['39', '40', '41', '42', '43', '44', '82', '83', '84', '85'];
const Rest = [];
let counter = 0;
 
for (let i = 0; i < input.length; i++) {
const RestNum = parseInt(input[i]) % 42;
if (!Rest[RestNum]) {
Rest[RestNum] = 1;
counter++;
}
}
 
console.log(counter);
 
// 1st Solution ( Wrong but this is correct in local)
// 아마 Object.keys가 적용되지 않는 듯? 인줄 알았으나 값을 가져오는 과정에 trim()을 추가하니 해결 되었다.
 
// For submit
 
// const fs = require('fs');
// const input = fs.readFileSync('/dev/stdin').toString().split('\n');
 
// For local test
 
// const input = ['39', '40', '41', '42', '43', '44', '82', '83', '84', '85'];
// const theRestMap = {};
 
// for (let num of input) {
// const theRest = num % 42;
// theRestMap[theRest] = theRestMap[theRest] ? theRestMap[theRest] + 1 : 1;
// }
 
// console.log(Object.keys(theRestMap).length);
728x90

백준 2577번: 숫자의 개수(https://www.acmicpc.net/problem/2577)

Code

https://github.com/DasolPark/Algorithm_JavaScript/commit/0a43c98b28beb602c12e983748c933e2b689708d

😊 charMap Object를 만들고, for of loop을 이용해 출현한 숫자는 key로 중복되는 값은 value로 늘려 저장한다.
그런 후 classic for loop을 이용해 해당 숫자가 있다면 해당 숫자의 출현 개수를, 없다면 0을 출력하여 해결한다.

Full Code

// const fs = require('fs');
// const input = fs.readFileSync('/dev/stdin').toString().split('\n');
 
// For Local Test
const input = ['150', '266', '427'];
const result = input[0] * input[1] * input[2];
const charMap = {};
 
for (let num of result.toString()) {
charMap[num] = charMap[num] ? charMap[num] + 1 : 1;
}
 
for (let i = 0; i < 10; i++) {
if (charMap[i]) {
console.log(charMap[i]);
} else {
console.log(0);
}
}
728x90

백준 2920번: 음계(https://www.acmicpc.net/problem/2920)

Code

https://github.com/DasolPark/Algorithm_JavaScript/commit/9935e611cba4242d667fa34aea394310a6a7f8fa

😢 처음에는 단순하게 '12345678'같은 string을 이용해 비교하여 풀었으나,
One-demensional Array라는 것에 의미를 두고 Array의 Index를 이용하여 다시 풀었다.

😊 i는 0부터 arr.length까지 증가한다는 전제 조건을 두고,
arr[i] - arr[i+1] = -1이 연속하여 7번 나온다면 1부터 8까지 오름차순인 ascending scale, 
arr[i] - arr[i+1] = 1이 연속하여 7번 나온다면 8부터 1까지 내림차순인 descending scale,
앞의 2가지 경우에 해당하지 않는다면, mixed scale 를 출력한다.

Full Code

// 2nd Solution(current - after)
 
// const fs = require('fs');
// const input = fs.readFileSync('/dev/stdin').toString().split(' ');
 
// For Local Test
const input = ['1', '2', '3', '4', '5', '6', '7', '8'];
// const input = ['8', '7', '6', '5', '4', '3', '2', '1'];
// const input = ['8', '1', '7', '2', '6', '3', '5', '4'];
let ascending = 0;
let descending = 0;
 
for (let i = 0; i < input.length - 1; i++) {
if (input[i] - input[i + 1] === -1) {
ascending++;
} else if (input[i] - input[i + 1] === 1) {
descending++;
}
}
 
if (ascending === 7) {
console.log('ascending');
} else if (descending === 7) {
console.log('descending');
} else {
console.log('mixed');
}
 
// 1st Solution(string)
 
// const fs = require('fs');
// const input = fs.readFileSync('/dev/stdin').toString().split(' ');
 
// For Local Test
// const input = ['1', '2', '3', '4', '5', '6', '7', '8'];
// const input = ['8', '7', '6', '5', '4', '3', '2', '1'];
// const input = ['8', '1', '7', '2', '6', '3', '5', '4'];
// const scale = parseInt(input.join(''));
// const ascending = 12345678;
// const descending = 87654321;
 
// if (scale === ascending) {
// console.log('ascending');
// } else if (scale === descending) {
// console.log('descending');
// } else {
// console.log('mixed');
// }

+ Recent posts