const fs = require('fs')
const inputData = fs.readFileSync('dev/stdin').toString().spilt(' ').map(value=>+value)
const [a,b,c] = inputData
백준에서 문자열을 받아올 때, 뒤에 \n
이 붙어 있을 수 있으니 trim() 메서드로 앞 뒤 공백을 제거하자.
숫자는 문자열로 사용할때 자동 변환되는 것이 아니라 string(), toString() 등의 메서드를 이용해서 수동 변환해야 한다.
let num = 12345
console.log(num.length)//undefined
마찬가지로 문자열도 숫자로 사용할때 한자릿수의 문자는 숫자로 인식되지만, 두자리 이상의 문자열은 숫자로 인식되지 않는다
let a = "5" 일때 for(let i = 0; i < a; i++){~~} 가능
let a = "15" 일때 for(let i = 0; i < a; i++){~~} 불가능 (아직 문자열로 인식)
문자열을 특정 기준으로 구분지어 배열로 생성하여 반환한다.
cosnt str = "apple"
str.spilt(' ') // [a,p,p,l,e]
해당 배열의 각 요소(element) 에 대해 새로운 배열을 생성하여 반환한다.
문자열은 for 문 등에서는 배열처럼 사용될 수 있지만 map 메서드에서는 split 메서드 등을 이용해 배열로 바꿔준다음 사용해야 한다.
해당 배열의 각 요소(element) 에 대해 함수(콜백함수) 를 한번씩 호출하는 메서드,
간단히 말하면 배열의 요소들을 반복호출해 주는 것으로 for 문을 처리해주는것.(빈 공간 생략)
let arr = [1,6, ,7,8]
arr.forEach(function(element, index){
console.log(`arr[${index}] = ${element}`);
})
// arr[0] = 1, arr[1] = 6, arr[3] = 7, arr[4] = 8
문자열에서 원하는 문자의 위치를 찾거나, 배열에서 배열값의 위치를 찾을 때 사용한다.
원소의 위치가 없거나 원소가 존재하지 않으면 -1 을 반환한다.
추가) 문자열도 배열로 취급/사용 할 수 있다.
JS 의 표준내장객체 중 하나이며, 중복되는 데이터를 제거한다.
let array = ["a","p","p","l","e"]
let set = new Set(array)
console.log(set)
// Set(4) {"a", "p", "l", "e"}
객체이므로 배열처럼 헷갈리면 안된다.
(배열을 이용해 -> set객체 생성 -> set 객체를 다시 배열로)
let array = ["a","p","p","l","e"]
let set = new Set(array)
console.log(set)//Set(4) { 'a', 'p', 'l', 'e' } 배열아님!
console.log(set.length)//undefined
let array2 = [...set]//다시 배열로 바꿔준다
console.log(array2)//[ 'a', 'p', 'l', 'e' ]
문자열의 앞,뒤 공백을 제거한다.
var str = " Hello World! "
console.log(str.trim())
// Hello World!
배열의 맨 앞의 데이터를 순서대로 제거한다. 매개변수 필요X. 지금 제거하는 데이터를 확인할 수 있도록 제거되는 데이터를 반환한다. 배열에만 사용되며, 앞 부분을 건드린다.
데이터(추가항목)를 배열 맨 앞에 추가한다(push() 는 반대로 맨 뒤에 추가한다). 배열에만 사용되며, 앞 부분을 건드린다.
배열의 각 요소에 대하여 주어진 리듀서(reducer) 함수를 실행하고 하나의 결괏값을 반환한다(최종 반환되는 값이 accumulator 이다). 두번째 인자로 초기값을 지정해줄 수 있다.
array.reduce(callback, initialValue)
초기값
리듀서 함수는 배열의 각 요소에 대해 실행하고, 3가지 인자를 받는다.
반환값: 누적된 계산값, 즉 accumulator 를 반환환다.
let array = [1,2,3]
function addCallback(acc, cur){
console.log(acc, cur);
return acc += cur;
}
array.reduce(addCallback)
// 1 2 초기값을 설정하지 않았기 때문에 acc 에 인덱스 0 의 값이, cur 에 인덱스 1 의 값이 들어간다.
// 3 3
// 6
// return 되는 값이 다시 acc 로 들어간다(누적).
// 따라서 acc += cur 을 return 하는 것과 acc + cur 을 return 하는 것은 "같은 것"이다.
추가 변형1
function addCallback(acc, cur, curIdx){
console.log("acc, cur, curIdx", acc, cur, curIdx);
return acc += cur ;
}
// acc, cur, curIdx 1 2 1 initialValue 를 지정해주지 않아 acc 가 인덱스 0, cur 가 인덱스 1 의 값이다.
// acc, cur, curIdx 3 3 2
추가 변형의 추가 변형
array.reduce(addCallback, 6)
// acc, cur, curIdx 6 1 0 초기값을 제공하기 때문에 acc 가 초기값, cur 가 인덱스 0 의 값이다.
// acc, cur, curIdx 7 2 1
// acc, cur, curIdx 9 3 2
0, -0, null, false, NaN, undefined, '' 의 값을 가지면 false 이고
나머지 값을 가지면 전부 true 이다.
객체의 모든 원소를 하나씩 추출하여 변수에 담아 반복문을 수행한다.
for of (value: 실제원소의 값)
for in (value: key 의 값)
var iterable = [3,5,7]
iterable.foo = "hello"
Object.prototype.objCustom = function(){...}
Array.prototype.arrCustom = function(){...}
for(var value of iterable){ console.log(value); }
// 3, 5, 7
for(var key in iterable){ console.log(key); }
// 0, 1, 2, "foo", "objCustom", "arrCustom"
for(...){
실행문 A
break;//실행문 B로 이동한다.
}
실행문 B
while(...){
실행문 A
break;//실행문 B로 이동한다.
}
실행문 B
for(...){
실행문 A
continue;//증감식으로 이동한다.
}
실행문 B
while(...){
실행문 A
continue;//조건식으로 이동한다.
}
실행문 B
미국 ANSI 에서 표준화한 정보교환용 7 비트 부호체계
문자열 or 문자를 아스키코드로 변환해준다.
let str = "abc"
console.log(str.charCodeAt(0))//변환할 문자열 인덱스
// 97
let str = "z"
console.log(str.charCodeAt())
// 122
아스키코드를 문자열로 변환해준다.
let ascii = 97
console.log(String.fromCharCode(ascii))
// "a"
console.log(String.fromCharCode(97,98,99))
// "abc"
String(), toString() 과 마찬가지로 배열 항목들을 문자열로 반환하는데,
여기서 더 나아가 원하는 구분자와 공백을 더해준다(필요한 능력을 "join" 해준다)
array.join(" ")// 공백만
array.join(" - ")// 공백 + -
array.join(" / ")// 공백 + /
둘다 해당 인자를 문자열로 변환한다는 점에서 동일하다.
String()
주어진 인자를 문자열로 변환할 뿐만 아니라, new 키워드와 함께 새로운 문자열 객체의 생성자가 될 수도 있다.
let num = 123
console.log(typeof num1) // number
let str = String(num1)
console.log(typeof str1) // string
let newString1 = String(123) // "123"
let newString2 = new String(400) // String {"123"}
toString()
주어진 인자를 문자열로 변환할 뿐만 아니라, 숫자의 메서드로 사용될 경우 인자로 2~36 사이의 값을 대입하면 숫자를 해당 진수로 변환한 문자열을 얻을 수 있다.
let num = 123;
console.log(typeof num); // number
let str = num.toString();
console.log(typeof str); // string
let num = 25
let str1 = num.toString()
console.log(str) // "25"
let str2 = num.toString(2)
console.log(str2) // "11001"
toUpperCase()
문자열을 대문자로 변환하여 반환한다. 원본 문자열 변경 X
toLowerCase()
문자열을 소문자로 변환하여 반환한다. 원본 문자열 변경 X
let str = "Hello World"
str.toUpperCase() // HELLO WORLD
str.toUpperCase() // hellow world
Object.values()
객체의 value 들만 추출하여 배열로 반환한다.
Object.keys()
객체의 key 들만 추출하여 배열로 반환한다.
let obj = {
"a": "apple",
"b": 12345,
"c": { "circle": "round"}
};
Object.values(obj) // ['apple', 12345, {…}]
Object.keys(obj) // ['a', 'b', 'c']
전달된 여러 인수들 중에서 가장 큰, 작은 값을 반환한다. 인수를 전달하지 않으면 -Infinity 를 반환한다.
인수들은 각각 ,
로 전달되어야 한다.
Math.max(1,2,3,4,5) // 5
Math.min(1,2,3,4,5) // 1
인수의 갯수가 유동적일 경우 배열로 전달하면 된다. 이때 apply 메서드나 spread 연산자를 사용한다.
const arr = [1,2,3,4,5]
Math.max.apply(null, arr) // 5
// Function.prototype.apply 메서드이다.
// max() 의 인수로 배열을 받을 수 없으니 배열을 인수로 받는 apply 를 사용한다.
// 첫번째 인수는 ".apply" 앞에 붙은 함수 내부에 전달할 this 객체를,
// 두번째 인수는 ".apply" 앞에 붙은 함수에 한번에 묶어서 전달할 인수꾸러미를 담당
Math.max(...arr) //5
Math.min 도 동일하다.
배열에 사용하며 역순배열을 반환한다.
const arr = ['a','p','p','l','e']
const arr2 = arr.reverse()
console.log(arr2)//[ 'e', 'l', 'p', 'p', 'a' ]
//추가로, 오름/내림 차순 정렬시에는 sort() 메서드를 사용한다.
//(문자열이면 spilt 메서드로 쪼개고 join메서드로 다시 붙힌다)
const narim = arr2.sort().reverse()
const oreum = narim.reverse()
console.log(narim, oreum)//[ 'a', 'e', 'l', 'p', 'p' ] [ 'a', 'e', 'l', 'p', 'p' ]
배열 정렬함수로써 영어와 한글 항목들을 오름차순으로 정렬해준다.
(영문대문자 > 영소문자 > 한글)
문자열 정렬시에는 매개변수를 사용하지 않으며, 정렬된 배열을 반환한다.
숫자 정렬 시에는 유니코드로 정렬되는 것을 막기 위해 비교함수를 사용한다.
배열명.sort(function(a,b){
return a - b;
//a 값이 b 보다 크다면 a - b 가 0 보다 클테니 a 는 b 보다 뒤쪽으로 정렬된다.
//반대일때는 return b - a 를 하면 된다.
주의사항
sort() 는 원본배열을 변경한다.
const arr = ['a','p','p','l','e']
const arr2 = arr.reverse()
console.log(arr, arr2)//[ 'e', 'l', 'p', 'p', 'a' ] [ 'e', 'l', 'p', 'p', 'a' ]
1. Number.isInteger(값)
값이 정수면 true, 아니면 fals 를 반환한다.
2. 나머지 연산자 % 활용
정수는 1로 나누었을 때 항상 0 이 된다.