정의 웹 스크래핑은 웹 페이지에서 우리가 원하는 부분의 데이터를 수집해오는 것을 뜻한다. 한국에서는 crawling 이라는 용어로 혼용해서 사용하는 경우가 많다. crawling은 원래 자동화하여 주기적으로 웹 상에서 페이지들을 돌아다니며 분류/ 색인하고 업데이트된 부분을 찾는 등의 일을 하는 것을 뜻한다. 따라서 web scrapping이라고 검색해야 페이지 추출에 대한 결과가 나올 것이다. https://dzone.com/articles/web-scraping-vs-web-crawling-whats-the-difference Web Scraping vs Web Crawling: What’s the Difference? - DZone In this article, read an explanation o..
HTML 요소들을 조작하는 편리한 Javascript 라이브러리로 사용전에 import 해주어야 한다. jQuery를 사용하기 위해서는 미리 작성된 자바스크립트 코드를 import 해와야 하는데, bootstrap css 파일을 가져올 때와 마찬가지로 내 컴퓨터에 해당 파일을 저장해서 사용할 수도 있지만 온라인 상의 파일을 참조할 수도 있다. 이를 head 태그 안에 넣어주면 된다. 또한 CSS와 마찬가지로 특정 요소를 가리켜야 조작할 수 있는데, CSS에서는 주로 class를 사용했다면 jQuery에서는 고유한 하나의 요소를 가리키는 id를 주로 사용한다. input 박스의 값 가져오기, 값 변경하기 let url = $('#article-url').val() url 'https://kimjingyu...
변수 자료형 var String String? final String 변수명 명명 규칙 카멜케이스 사용 영문 / _ / $ / 숫자만 사용 가능하고, 숫자로 시작 불가능 자료형 자료형 String int, double bool List Map dynamic 모든 자료형을 담을 수 있음 dynamic 치환법 dymaicValue as int 연산자 산술 연산자 중에 특이한 ~/ 연산자가 있다. %: 나머지 ~/: 몫 //: 몫과 나머지 함수 파라미터 void say(String from, String message) { print("$from : $message"); // 영희 : 철수야 안녕? } Named Parameter 이름지정 매개변수는 함수 호출시 값을 전달하지 않아도 되므로 7번째 줄에 입력 ..
네이버 접속 후 로그인 버튼 클릭 + 검색 창에 검색 단어 입력 후 키보드 엔터 누르기 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys browser = webdriver.Chrome() browser.get("https://www.naver.com") elem = browser.find_element(By.CLASS_NAME, "MyView-module__link_login___HpHMW") elem.click() broswer.back() browser.forward() elem = browser.find_element(By.ID,..
문제를 쪼개서 작은 문제의 답을 구하고, 그걸로 더 큰 문제의 답을 구하는 것을 반복하는 알고리즘 분할정복과 비슷한 느낌이다. DP 구현 2가지 방법 Top-down 구현 방법: 재귀 저장 방식: Memoization Bottom-up 구현 방법: 반복문 저장 방식: Tabulation Memoization 한 번 구한 답들은 저장해두자는 저장 방식이다. 즉, 부분 문제들의 답을 한 번 구했으면, 또 구하지 않도록 (중복연산 방지) cache에 저장해두고, 다음부터 가져다 쓰는 방식 필요한 부분 문제들만 구한다. (Lazy-Evaluation) Tabulation 부분 문제들의 답을 미리 다 구해두면 편하다. 테이블을 채워간다는 의미이다. 필요 없는 부분 문제들까지 전부 구한다. (Eager-Evalua..
탐색 전에 반드시 정렬되어 있어야하고, 범위를 절반씩 줄여가면서 답을 찾아야한다. 시간복잡도 따라서 정렬 O(NlogN) + 이진탐색 O(logN) -> 결과적으로 O(NlogN). 즉, 경우에 따라서 선형탐색 O(N) 이 더 좋은 선택이 될 수도 있다. 하지만 여러번 탐색을 해야하는 경우라면, 그 탐색의 횟수가 N번이라면, 선형 탐색의 경우에는 N * O(N) = O(N^2) 이 된다. 그러나 이진 탐색을 하면, 정렬 O(NlogN) + N * O(logN) = O(NlogN)이 된다. 결론 결과적으로 탐색을 한번만 하는 경우에는 굳이 정렬을 해가면서 이진탐색을 사용할 이유가 없다. 하지만 탐색을 여러번 해야하는 경우에는 정렬 한번 해두고, 이진탐색을 해주는게 더 빠를 수 있다. C++ lower/up..
기본적으로 모든 경우를 탐색하며, DFS/BFS와 방식은 유사하다. 하지만 백트래킹은 가지치기를 통해 탐색 경우의 수를 줄인다는 차이가 있다. 정리하면, 백트래킹은 최악의 경우에는 모든 경우를 다 살펴보게 될 수도 있지만, 가지치기를 통해서 가능한 덜 보겠다는 전략이다. 가지치기의 원리는 가망성이 없으면 가지 않겠다는 원리를 바탕으로 한다. 어려운 문제일수록 극한의 가지치기를 요구할 수 있음
시간복잡도 인접행렬: O(V^2) 인접리스트: O(V + E) == O(max(V,E)) 정점의 개수와 간선의 개수 중 더 큰 값을 기준으로 인접리스트는 간선의 개수가 적을수록 메모리 공간을 덜 잡아먹는 장점이 있었음 만약 간선의 개수가 V에 비해 월등히 적으면 O(V)로 표현이 될 수 있음 즉, 간선 개수가 적으면 인접리스트가 훨씬 유리해진다.
순환성이 없는 무방향 그래프이다. 특징 특정하지 않는한 어떤 노드든지 root가 될 수 있다. 가장 바깥쪽 노드는 leaf node이다. node A에서 node B로 가는 경로는 반드시 존재하며 유일하다. (단 1개) 노드개수 = 간선개수 + 1 자료구조에서의 트리 부모 -> 자식 관계가 있는 방향 그래프이며, root는 하나다.