JS 알고리즘 입출력, 메서드, 에러

Hyun·2021년 12월 21일
0

알고리즘

목록 보기
4/10
const fs = require('fs')
const inputData = fs.readFileSync('dev/stdin').toString().spilt(' ').map(value=>+value)
const [a,b,c] = inputData
  • fs : File System 모듈
  • readFileSync : 파일을 읽고 난 후에 실행(동기 처리)
  • stdin : 표준 입력 파일('dev/stdin' 은 stdin 의 경로, 시스템에 따라 변경될 수 있음
  • toString() : 읽어서 가져온 반환값은 Buffer 객체이므로 string 형으로 변환
  • spilt(' ') : 공백 기준으로 잘라준다(여러줄인 데이터의 경우 \n 으로 설정)
  • map(value => value) : 문자열(value)을 정수형으로 바꾸기 위함

기본 알고리즘 메서드

기본 주의사항

  • 백준에서 문자열을 받아올 때, 뒤에 \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++){~~} 불가능 (아직 문자열로 인식)

spilt

문자열을 특정 기준으로 구분지어 배열로 생성하여 반환한다.

cosnt str = "apple"
str.spilt(' ') // [a,p,p,l,e]

map

해당 배열의 각 요소(element) 에 대해 새로운 배열을 생성하여 반환한다.

문자열은 for 문 등에서는 배열처럼 사용될 수 있지만 map 메서드에서는 split 메서드 등을 이용해 배열로 바꿔준다음 사용해야 한다.

forEach

해당 배열의 각 요소(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

indexOf

문자열에서 원하는 문자의 위치를 찾거나, 배열에서 배열값의 위치를 찾을 때 사용한다.
원소의 위치가 없거나 원소가 존재하지 않으면 -1 을 반환한다.

추가) 문자열도 배열로 취급/사용 할 수 있다.

Set

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' ]

trim

문자열의 앞,뒤 공백을 제거한다.

var str = "       Hello World!        "
console.log(str.trim())
// Hello World!

Math 객체 메서드

  • Math.ceil(): 소수점 올림, 정수 반환
  • Math.floor(): 소수점 버림, 정수 반환
  • Math.round(): 소수점 반올림, 정수 반환
    // () 안에 변환활 숫자가 들어간다.
    그외
  • toFixed(): 원하는 소수점 길이만큼 반올림하여 반환
  • toExponential(): 지정한 소수점 이하부터는 지수표기법으로 변환되어 반환
    // () 안에 지정할 길이/숫자가 들어간다.

shift

배열의 맨 앞의 데이터를 순서대로 제거한다. 매개변수 필요X. 지금 제거하는 데이터를 확인할 수 있도록 제거되는 데이터를 반환한다. 배열에만 사용되며, 앞 부분을 건드린다.

unshift

데이터(추가항목)를 배열 맨 앞에 추가한다(push() 는 반대로 맨 뒤에 추가한다). 배열에만 사용되며, 앞 부분을 건드린다.

reduce

배열의 각 요소에 대하여 주어진 리듀서(reducer) 함수를 실행하고 하나의 결괏값을 반환한다(최종 반환되는 값이 accumulator 이다). 두번째 인자로 초기값을 지정해줄 수 있다.

array.reduce(callback, initialValue)

초기값

  • initialValue: callback 의 최초 호출에서 첫번째 인수에 제공되는 값. 초기값을 제공하지 않으면 배열의 첫번째 요소를 사용한다. 빈 배열에서 초기값이 없이 method 를 호출하면 오류 발생.

리듀서 함수는 배열의 각 요소에 대해 실행하고, 3가지 인자를 받는다.

  • accumulator: 콜백의 반환값이 누적된 데이터, 콜백의 이전 반환값 or 콜백의 첫번째 호출이면서 initialValue 를 제공한 경우 initialValue 로 설정한다.
  • currentValue: 처리할 현재 요소
  • current(Index): 옵션이다. 현재 처리할 요소의 인덱스이며 initialValue 를 제공한 경우는 인덱스 0 부터 시작하고 제공하지 않으면 1(인덱스 0 다음의 것) 부터 시작한다.

반환값: 누적된 계산값, 즉 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

true & false

0, -0, null, false, NaN, undefined, '' 의 값을 가지면 false 이고
나머지 값을 가지면 전부 true 이다.

for of & for in

객체의 모든 원소를 하나씩 추출하여 변수에 담아 반복문을 수행한다.

for of (value: 실제원소의 값)

  • 배열의 각 원소를 임시 변수로 담을 value 에는 "실제 원소의 값" 이 담겨있다.
  • 반복가능한 객체에만 사용할 수 있다.(Array, Map, Set, String, TypedArray, arguments 객체 등)
    = [Symbol.iterable] 속성을 가지는 컬렉션이 적용됨

for in (value: key 의 값)

  • 객체의 속성들을 반복하여 작업수행이 가능하다.
  • 모든 객체에서 사용이 가능하다.
  • "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" 
                                      

break 문

  • 반복문인 for, while, do-while 문의 실행을 중지할때 사용한다.
    swtich 문에서도 break 문을 사용하여 종료한다.
  • 그냥 가까운 반복문을 아예 빠져나온다고 생각하면 된다.
for(...){                          
  실행문 A
  break;//실행문 B로 이동한다.
}
실행문 B
while(...){
  실행문 A
  break;//실행문 B로 이동한다.
}
실행문 B

continue 문

  • 반복문인 for, while, do-while 문에서만 사용한다.
  • for 문에서는 증감식, while, do-while 문에서는 조건식으로 이동한다.
for(...){
  실행문 A
  continue;//증감식으로 이동한다.
}
실행문 B
while(...){
  실행문 A
  continue;//조건식으로 이동한다.
}
실행문 B

ASCII 코드

미국 ANSI 에서 표준화한 정보교환용 7 비트 부호체계

  • 대문자 A~Z: 65~90, 소문자 a~z: 97~122

charCodeAt()

문자열 or 문자를 아스키코드로 변환해준다.

let str = "abc"
console.log(str.charCodeAt(0))//변환할 문자열 인덱스
// 97

let str = "z"
console.log(str.charCodeAt())
// 122 

String.fromCharCode()

아스키코드를 문자열로 변환해준다.

let ascii = 97
console.log(String.fromCharCode(ascii))
// "a"

console.log(String.fromCharCode(97,98,99))
// "abc"

Error

  • Syntax Error: 구문상 에러 = 문법상 에러
  • Reference Error: 참조 에러, 잘못된 값을 참조했을 때
  • Type Error: 타입에러, 변수나 매개변수가 우효한 자료형이 아닐 때
  • Uncaught Type Error: Assignment to Constant variable:
    상수값에 새로운 값을 적용하려 할때

join()

String(), toString() 과 마찬가지로 배열 항목들을 문자열로 반환하는데,
여기서 더 나아가 원하는 구분자와 공백을 더해준다(필요한 능력을 "join" 해준다)

array.join(" ")// 공백만
array.join(" - ")// 공백 + -
array.join(" / ")// 공백 + /

String() & toString()

둘다 해당 인자를 문자열로 변환한다는 점에서 동일하다.

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() & toLowerCase()

toUpperCase()
문자열을 대문자로 변환하여 반환한다. 원본 문자열 변경 X
toLowerCase()
문자열을 소문자로 변환하여 반환한다. 원본 문자열 변경 X

let str = "Hello World"
str.toUpperCase() // HELLO WORLD
str.toUpperCase() // hellow world

Object 메서드

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']

Math.max & Math.min

전달된 여러 인수들 중에서 가장 큰, 작은 값을 반환한다. 인수를 전달하지 않으면 -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 도 동일하다.

reverse()

배열에 사용하며 역순배열을 반환한다.

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()

배열 정렬함수로써 영어와 한글 항목들을 오름차순으로 정렬해준다.
(영문대문자 > 영소문자 > 한글)
문자열 정렬시에는 매개변수를 사용하지 않으며, 정렬된 배열을 반환한다.

숫자 정렬 시에는 유니코드로 정렬되는 것을 막기 위해 비교함수를 사용한다.

배열명.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 이 된다.

profile
better than yesterday

0개의 댓글