목차
목차1. 코딩테스트 준비 방법1-1. 알고리즘 잘 배우는 법1-2. 마음가짐1-3. 코딩테스트 잘 보는 법1.4 문제유형 추측하기1.5 엣지케이스 찾는 법1.6 좋은 코드를 만드는 법2. JS의 9가지 코드 트릭2-1. 구조분해 할당을 통한 swap2-2. 배열 생성으로 루프 제거하기2-3. 배열 내 같은 요소 제거하기2-4. Spread 연산자를 통한 객체 병합2-5. 단축평가 (&&와 || 사용)2-6. 구조 분해 할당 사용하기2-7. 객체 생성 시 키 생략하기2-8. 동적 속성 이름2-9. !!연산자를 사용하여 Boolean값으로 바꾸기3.HTML 과 CSS4. DOM과 virtualDOM4.1 DOM 예약어4.2 Virtual DOM이란?5.DOM 조작 실습 - 간단한 에디터 만들기
1. 코딩테스트 준비 방법
1-1. 알고리즘 잘 배우는 법
1) 항상
여러가지 풀이방법
이 있다는 것 기억하기2) 항상
예외가 있을 수 있다는 것
기억하기3) 내가 풀어낸 답이
베스트인지 의심
하기4) 문제풀고
시행착오를 모두 기록
하기5)
다른사람의 코드
를 많이 보기.6)
포기하지 말기
. 1문제 최대 3시간 정도 투자하기1-2. 마음가짐
1) 알고리즘 마스터 될 필요가 없다.
- 회사는 업무 수행 기초능력을 확인하고 싶을 뿐
- 대회용 알고리즘 보다는
논리적인 사고가 가능한 문제해결 능력
이 필요
2)
어디까지 공부할 지
정하는 것이 중요하다.1-3. 코딩테스트 잘 보는 법
1) 나의 성향을 파악하기
- 미리 생각하고 수도코드를 작성해야 더 잘풀리는 사람?
- 일단 코드를 작성해야 생각이 더 잘 풀리는 사람?
2) 메모하기
- 긴장하면 풀다가 놓칠 수 있다.
- 풀이과정과 순서도 기록하기
3) 디버깅
- 내가 예상한대로 동작이 안된다면 디버깅할 것
- 로직 중간에 console.log()를 통해 확인
- 외부 IDE 사용가능하다면 nodejs 디버깅 모드 사용해보기
4) 익숙해지기
- 문제를 잘 읽는 것에 익숙해지기 (라인코테 2번 문제 잘못읽어서 날림..)
- 시간복잡도 계산에 익숙해지기 (
입출력보고 알고리즘 방향 선택가능
)
- 엣지케이스 있다는 것 익숙해지기
1.4 문제유형 추측하기
1)
입력값 범위
를 통해 시간복잡도 및 알고리즘 유추
하기- 10,000,000(천만이상) :
O(n)
- 동적계획법(DP)
- 그리디
- 100,000(십만~백만):
O(nlogN)
- 동적계획법(DP)
- 정렬
- 힙, 우선순위 큐
- 위상정렬
- 다익스트라 알고리즘
- 2,000(이천~만):
O(n^2)
- n*n의 2차원 리스트 모두 순회하는 문제
- 500 :
O(n^3)
- 완전탐색
- 백트래킹
2) 케이스에 따른 문제 유형
- 지도가 주어지고, 채워진 영역을 찾아야하는 경우
- BFS, DFS
- FloodFill(기본), 전염병문제(변형), 치즈문제(변형)
3) 그래프 그림이 있는 경우
- 최단 거리 찾기
- 가장빠른길, 최단 거리, x비용 내로 갈 수 있는 길 찾기
- DFS, BFS, 다익스트라 사용가능
- 최소 신장 트리
- “가장 저렴한 방법으로 모든 경로 연결하기”
- 통신망, 전송시간, 회로, 배관등 + “가장 싸게 연결”
- 크루스칼, 프림 알고리즘 이용
- 위상정렬
- 순서를 정해야할 때 사용 - “순서”, “차례”
4) x라는 조건 만족하는 최대/최소값 찾기
- 결정문제로, 파라메트릭 서치 사용
5) 실시간 정렬이 이루어져야 하는 경우
- 우선순위 큐 / 힙 으로 구현
6) DP 문제
- 완전탐색 가능한 시간복잡도는 아닌데, 특별한 알고리즘이 없을 때 DP 가능성 높다.
- 문제따라 초기값 적기 → 모든 상태값 적기 → 현재상태에서 다음값 구할 수 있는지 판단 → 이전상태를 통해 현재 값 구할 수 있는지 판단
7) 문자열 주어지는 경우
- 구현 문제일 가능성 높다.
8) “가장 많은 선택”, “가장 작은/큰" 등의 키워드
- 최적의 선택을 하는 그리디 문제
1.5 엣지케이스 찾는 법
1) 입력 값의 크기가 굉장히 작은 케이스
2) 입력 값의 크기가 굉장히 큰 케이스
3) 입력 값의 범위가 넓은 케이스
4) 음수입력이 가능할 경우, 음수로만 입력받는 케이스
5) 리스트를 입력 받을 때, 값이 없거나 하나만 있는 케이스
+) 그래프에서 사이클 발생하는 경우
+) 길찾기문제에서 지그재그 움직일 경우
1.6 좋은 코드를 만드는 법
1) 간결하고 가독성 좋은 코드 작성하기
- 변수,함수의 이름을 명확히 했는가
- 중복 코드를 제거했는가
- 함수형프로그래밍(고차함수-map, reduce, filter)
2) 가지치기를 했는가
- 성능개선을 고려했다는 점에서 좋은 평가 받을 수 있다.
3) 자바스크립트 코드 활용
- 구조분해 할당, ...오퍼레이터
4) 일관성 유지하기
(중요!!)
- 변수명 정책
- snake_case, camelCase 확인하기
2. JS의 9가지 코드 트릭
2-1. 구조분해 할당을 통한 swap
let a = 5, b = 10; [a,b] = [b, a] log(a,b) // 10, 5
2-2. 배열 생성으로 루프 제거하기
Array.from( Array(), () ⇒ )
로 반복 가능
let sum = 0; for(let i = 1; i <= 10; i++){ sum += i } // 함수형 프로그래밍 const sum = Array .from(new Array(10), (_, i) => i+1); .reduce((acc, cur) => acc + cur, 0);
2-3. 배열 내 같은 요소 제거하기
Array.from()
,Set
,[...Set]
const names = ['Lee', 'Kim', 'Park', 'Lee', 'Kim']; const uniqueNameWithArrayFrom = Array.from(new Set(names)); // ['Lee', 'Kim', 'Park'] const uniqueNamesWithSpread = [...new Set(names)]; // ['Lee', 'Kim', 'Park']
2-4. Spread 연산자를 통한 객체 병합
const person = { name: "Outwater", gender: "male" } const company = { name : "DevCourse" address : "Seoul" } const insoo = {...person, ...company} // { name: 'DevCourse', gender: 'male', address: 'Seoul' }
- 키가 값다면 뒤에 것이 우선순위가 되어 오버라이드 된다.
2-5. 단축평가 (&&와 || 사용)
단축평가란 논리연산자, 삼항연산자를 통해 어디까지 값이 계산되는지를 파악하고, 최대한 계산량을 줄이는 것.
&& 연산자
는 하나라도 Falsy가 나오면 계산을 멈춤|| 연산자
는 하나라도 Truthy가 나오면 계산을 멈춤true && true && "도달 O"; true && false && "도달 X"; false || false || "도달 O"; true || false || "도달 X"; // false 리턴 true || true || "도달 X";
단축평가를 통해 if문을 줄여서 사용할 수가 있다.
- or연산자(
||
)는 default값이 정해져있을 때 사용하기 편리하다.
return 할당되는값 || default값
or연산자 CASE01
badCase1
- if문 사용function fetchDate() { if (state.data) { return state.data; } else { return "Fetching..."; }}
badCase2
- 삼항연산자 사용function fetchDate() { return state.data ? state.data : "Fething..."; }
GoodCase
-or연산자 사용function fetchDate() { return state.data || "Fetching..."; }
or연산자 CASE02
badCase1
- if-else문 사용function favoriteDog(someDog) { let favoriteDog; if (someDog) { favoriteDog = someDog; } else { favoriteDog = "냐옹"; } return favoriteDog + "입니다"; }
goodCase
- or연산자 사용function favoriteDog(someDog) { return (someDog || "냐옹") + "입니다"; }
&&연산자 CASE03
badCase1
- if-else문 사용 (중첩구조)const getActiveUserName = (user, isLogin) => { if(isLogin){ if(user){ if(user.name){ return user.name } else { return '이름없음' } } } }
goodCase
- &&연산자 사용 (depth 처리)const getActiveUserName = (user, isLogin) => { if(isLogin && user){ if(user.name){ return user.name } else { return '이름없음' } } }
betterCase
- ||연산자 사용 (+default값처리)const getActiveUserName = (user, isLogin) => { if(isLogin && user){ return user.name || '이름없음' } }
2-6. 구조 분해 할당 사용하기
- 필요한 속성만 꺼내서 사용
const person = { name: 'Lee Sun-Hyoup', familyName: 'Lee', givenName: 'Sun-Hyoup' company: 'Cobalt. Inc.', address: 'Seoul', } const { familyName, givenName } = person;
2-7. 객체 생성 시 키 생략하기
- 객체를 생성할 때 프로퍼티 키를
변수 이름
으로 생략할 수 있습니다.
const name = 'Lee Sun-Hyoup'; const company = 'Cobalt'; const person = { name, company } console.log(person); // { // name: 'Lee Sun-Hyoup' // company: 'Cobalt', // }
2-8. 동적 속성 이름
- ES6에 추가 된 기능으로, 객체의 키를 동적으로 생성가능
const nameKey = 'name'; const emailKey = 'email'; const person = { [nameKey]: 'Lee Sun-Hyoup', [emailKey]: 'kciter@naver.com' }; console.log(person); // { // name: 'Lee Sun-Hyoup', // email: 'kciter@naver.com' // }
2-9. !!연산자를 사용하여 Boolean값으로 바꾸기
!!연산자
는 falsy값인 경우 false를 리턴, 그 외는 true를 리턴한다.
falsy값
: 0, null, undefined, NaN, 빈 문자열
function check(variable) { if (!!variable) { console.log(variable); } else { console.log('잘못된 값'); } } check(null); // 잘못된 값 check(3.14); // 3.14 check(undefined); // 잘못된 값 check(0); // 잘못된 값 check('Good'); // Good check(''); // 잘못된 값 check(NaN); // 잘못된 값 check(5); // 5
3.HTML 과 CSS
4. DOM과 virtualDOM
돔은 왜탄생?
- js 탄생과 같이 등장
- form요소를 다루는 것에서 시작
돔의 구성요소
- 문서노드
- 요소노드
- 속성노드 (not 자식노드)
- 텍스트 노드 (자식요소를 가질 수 없음)
DOM Tree 순회는 전위순회(
preorder, Root>left>right
)DOM Tree 렌더링 순서
- 1) html 파싱 (DOM)
- 2) css 파싱 (CSSOM)
- 3) 렌더트리 구성
- 4) 실제화면에 페인팅
4.1 DOM 예약어
- ...
- querySelector
- windiw.[id[
DOM탐색
- parentNode
- firstElementNode (없다면 null)
- children (모든 자식요소, 없다면 [] )
DOM 조작
- hasAttribute(-)
- getAttribute() (없다면 null)
- textContent
- innerHTML (XSS위험요소)
- createElement
- appendChild
- removeChild
4.2 Virtual DOM이란?
- DOM을 수정할 경우, 모든 렌더트리가 다시 그려지며 많은 시간을 소요하는 문제를 해결하기 위해 등장한 방법
- 실제 DOM Tree를 필요한 부분만 골라 js의 객체형식으로 만들어놓은 트리
가상돔의 오해
- virtualDOM은 DOM 보다 빠르다?
- 항상은 아니다.
- 탐색량도 많고, 메모리를 많이 사용한다. 다만 개발편의성, 렌더트리의 변경을 줄이기 위해 사용
5.DOM 조작 실습 - 간단한 에디터 만들기
- html 태그 중
contenteditable =”true”
해당 요소안에서, 글 작성이 가능해진다.
document.execCommand()
🔗링크- 내부의 텍스트에 대하여
css관련 여러 명령어
를 적용시키는 예약어 - 이벤트리스너와 함께 사용
- 단, 현재 deprecated 된 상태로 연습용으로만 사용
// 텍스트 bold 처리하기 document.querySelector(".bold").addEventListner("click", () => { document.execCommand("bold); }