라이브러리 알고리즘 사용하기 using LIBRARY ALGORITHMS

Slides:



Advertisements
Similar presentations
Hash Map. 시퀀스 컨테이너와 연관 컨테이너 시퀀스 컨테이너 -vector, list, deque 등 - 보관할 자료의 양이 많지 않고, - 검색이 중요하지 않은 경우 연관 컨테이너 -map, set, hash_map, hash_set -Key 와 짝을 이루어 자료.
Advertisements

Python Ch.06 RaspberryPi Sejin Oh. Raspberry Pi Python  IDLE(Integrated Development Environment)  라즈베리 파이 배포본들은 일반적으로 파이썬과 파이썬 3 의 IDLE 파 이썬 개발 도구를.
순차 컨테이너의 사용 및 문자열 분석 USING SEQUENTIAL CONTAINERS AND ANALYZING STRINGS Chapter 5.
1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
이진 나무 구조 강윤섭 2008년 5월 23일.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
Report #5 - due: 4/13 다음 10*5의 희소 행렬 A, B를 고려하라.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
10장 예외 Lab 10-1.
제6장 객체배열과 벡터 객체 배열을 이해한다. 벡터(vector) 클래스를 사용할 수 있다.
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
제15장 STL과 람다식 STL의 개념을 이해하고 사용할 수 있다. 람다식을 이해하고 사용할 수 있다.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
10장 함수.
5장. 참조 타입.
제 3장. C보다 나은 C++ II.
제3장 스택과 큐.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
C++ Espresso 제12장 템플릿.
Tail-recursive Function, High-order Function
연관 컨테이너 사용하기 using associative containers
프로그래밍 랩 – 7주 리스트.
PySpark Review 박영택.
제네릭 함수 작성하기 WRITING GENERIC FUNCTIONS
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
11장. 1차원 배열.
C#.
13. 연산자 오버로딩.
Method & library.
어서와 C언어는 처음이지 제14장.
추상 데이터 타입 정의하기 Defining abstract data types
인터넷응용프로그래밍 JavaScript(Intro).
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
Report #3 - due: 4/6 100*100의 2개의 희소 행렬 A, B를 전달 받아서 이들의 덧셈을 구하고, 그 결과의 행렬 C를 반환하는 add_sparse_matrix(A, B, C)를 다음과 같이 작성하라. 희소 행렬은 sparse_matrix 타입으로 표현된다.
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
24장. 파일 입출력.
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
제 1장. C++ 시작하기.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
에어 조건문.
제 3 강.
제 4장. 객체 지향 프로그래밍 시작하기 학기 프로그래밍언어및실습 (C++).
제 4장. 객체 지향 프로그래밍 시작하기 학기 프로그래밍언어및실습 (C++).
루프와 카운트 Looping and counting
문자열 컴퓨터시뮬레이션학과 2015년 봄학기 담당교수 : 이형원 E304호,
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
제 15 강 문자와 코드 shcho.pe.kr.
Ch16_표준 템플릿 라이브러리.
5장. 선택 알고리즘.
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
메모리 관리 및 저수준 자료구조 Managing Memory and low-level data structures
JSP Programming with a Workbook
함수, 모듈.
Summary of Pointers and Arrays
Numerical Analysis Programming using NRs
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
제 4 장 Record.
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
김선균 컴퓨터 프로그래밍 기초 - 12th : 문자열 - 김선균
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
어서와 C언어는 처음이지 제21장.
 6장. SQL 쿼리.
13. 포인터와 배열! 함께 이해하기.
C++ Espresso 제15장 STL 알고리즘.
6 객체.
Presentation transcript:

라이브러리 알고리즘 사용하기 using LIBRARY ALGORITHMS Chapter 6 라이브러리 알고리즘 사용하기 using LIBRARY ALGORITHMS

6장에서는 표준 알고리즘을 사용하면, 표준 알고리즘들은 일관적인 인터페이스 제공 동일한 코드를 반복해서 작성하는 수고를 덜 수 있다. 더 작고 단순한 프로그램이 된다. 때로 놀라울 정도로! 표준 알고리즘들은 일관적인 인터페이스 제공 컨테이너, 반복자가 동일한 인터페이스를 제공하는 것처럼 vector, string, list, map은 insert()를 이용하여 요소 삽입, erase()로 요소 삭제 반복자는 ++연산자를 이용하여 다음요소로 반복자를 이동, *연산자를 이용하여 반복자의 요소를 접근.. 등 몇 가지에 익숙해지면 나머지는 쉽다.

6.1 string 분석하기 두 문자 그림을 합치는 문제에서, 벡터 top과 bottom에 스트링이 저장되어 있을 때, ret에 이미 top을 추가한 상태에서, 두 벡터를 합치는 방법 ?? top bottom ******* * To * $$$$$$$$$$ $ John $ $ $ ******* * To * $$$$$$$$$$ $ John $ $ $ 합치면

두 벡터 결합 방법 방법 1-1: 방법 1-2: 방법 2: 알고리즘을 사용한 보다 일반적인 해결책은 ret에 이미 top을 추가한 상태에서, ret의 끝에 bottom의 복사본을 추가하는 작업 방법 1-1: 방법 1-2: 방법 2: 알고리즘을 사용한 보다 일반적인 해결책은 for(vector<string>::const_iterator it=bottom.begin(); it!=bottom.end(); ++it) ret.push_back(*it); ret.insert( ret.end(), bottom.begin(), bottom.end() ); copy(bottom.begin(), bottom.end(), back_inserter(ret));

알고리즘 copy(b, e, d) copy(begin, end, out) 제너릭 알고리즘(generic algorithm) 특정 종류의 컨테이너에만 해당되는 것이 아니라, 전달되는 인자에 따라 액세스 방법을 결정해서 처리해 준다. 인자로 대개 반복자를 취하고, 그 반복자를 이용하여 컨테이너의 요소들을 다룸 copy(bottom.begin(), bottom.end(), back_inserter(ret)); while (begin!=end) *out++ = *begin++;

반복자 어댑터: back_inserter(c) 반복자 어댑터(iterator adapter): back_inserter(c) 인자로 컨테이너 c를 취하며, 목적지로 사용될 경우, 컨테이너 c의 끝에 요소들을 추가하는 반복자를 내어준다. <iterator>에 정의되어 있음. 오류인 경우: copy(bottom.begin(), bottom.end(), ret); // ret가 반복자가 아니므로 (컴파일 오류) copy(bottom.begin(), bottom.end(), ret.end()); // ret.end()에 요소가 없으므로 // (컴파일 오류가 나지 않으므로 더욱 주의 요망) copy가 왜 이렇게 설계되어 있을까요? 요소를 복사하는 작업과 컨테이너를 확장하는 작업을 분리하기 위해

6.1.1 split 함수- 인덱스 사용한 방법 5.6절의 split() vector<string> split(const string& s){ vector<string> ret; typedef string::size_type string_size; string_size i = 0; while (i != s.size()) { // 단어의 시작 위치 찾고 while (i != s.size() && isspace(s[i])) ++i; // 단어의 끝 위치 찾고 string_size j = i; while (j != s.size() && !isspace(s[j])) ++j; // 그것을 vector에 넣고 if (i != j) { ret.push_back( s.substr(i, j - i) ); i = j; } return ret;

split() 함수 – 반복자와 알고리즘 사용 vector<string> split(const string& str) { vector<string> ret; typedef string::const_iterator iter; // string 타입이 // 반복자 지원 iter i = str.begin(); while (i != str.end()) { // 맨 앞 공백들을 무시 i = find_if(i, str.end(), not_space); // 다음 단어의 끝을 찾음 iter j = find_if(i, str.end(), space); // [i,j)의 문자들을 복사 if (i != str.end()) ret.push_back(string(i, j)); i = j; } return ret; 이것은 무엇?

알고리즘 find_if() iter j = find_if(i, str.end(), space); find_if() 함수는 처음 두 인자(argument)들은 시퀀스(sequence)를 나타내는 반복자 세 번째 인자는 동작함수(predicate)로서, true나 false를 리턴한다. find_if() 함수는 동작함수가 true의 결과를 내는 요소를 찾아 멈춘다. 동작함수가 false이면, 두 번째 인자를 리턴 한다. 동작 함수(predicate) // `true' if the argument is whitespace,`false' otherwise bool space(char c) { return isspace(c); } // `false' if the argument is whitespace, ‘true' otherwise bool not_space(char c) { return !isspace(c); }

ret.push_back(string(i, j)); 반복자로부터 직접 스트링을 생성. [i, j) 범위의 문자들의 복사본 string을 생성한다. s.substr(i, j-i)는 인덱스에 대해서만 동작 반복자에 대해서 작동하지 않음

6.1.2 회문(palindromes) 회문: 앞쪽에서 보나 뒤쪽에서 보나 철자가 같은 단어 라이브러리를 사용하지 않는 경우 예) civic, eye, madam, …. 라이브러리를 사용하지 않는 경우 string str; string::size_type size; bool flag=true; cin >> str; size=str.size() – 1; for(string::size_type i=0; i != str.size(); i++) { if(str[i] != str[size - i]) { flag = false; break; // 반복문을 벗어남 } if(flag == true) cout << "correct" << endl; else cout << "incorrect" << endl;

알고리즘 equal() equal(s.begin(), s.end(), s.rbegin()); 두 시퀀스들을 비교하여, 그 둘이 같은 값을 가졌는지를 검사해서, 같으면 true, 다르면 false를 리턴한다. 첫 번째 시퀀스: s.begin()에서 s.end() 두 번째 시퀀스: s.rbegin()에서 첫번째 시퀀스와 동일한 크기 만큼. 따라서, 끝을 나타내는 반복자가 필요 없다. 예. 두 단어를 입력받아서, equal() 함수를 이용하여 같은 단어인지 검사하려면? bool is_palindrome(const string& s) { return equal(s.begin(), s.end(), s.rbegin()); }

6.1.3 URL 찾기 웹 주소를 찾는 함수를 작성해 보자.. URL(Uniform Resource Locator)의 형식 protocol-name://resource-name 예) http://cv.chonbuk.ac.kr/~isoh 입력 받은 문자열에서 URL을 모두 찾아 vector에 저장하는 문제 find_urls() 함수에서는 반복자 b를 사용하여 스트링을 순회하며 :// 문자들을 찾는다. 찾았으면, 반대방향으로 protocol-name을 찾고, 원래 방향으로 resource-name을 찾는다. 13

find_urls() text http://www.acceleratedcpp.com more text b=url_beg(b,e) after=url_end(b,e) find_urls() vector<string> find_urls(const string& s){ vector<string> ret; typedef string::const_iterator iter; iter b = s.begin(), e = s.end(); // look through the entire input while (b != e) { // look for one or more letters followed by `://' b = url_beg(b, e); // if we found it if (b != e) { // get the rest of the \s-1URL\s0 iter after = url_end(b, e); // remember the \s-1URL\s0 ret.push_back( string(b, after) ); // advance b and check for more URL on this line b = after; } return ret; 14

url_end() 함수 string::const_iterator url_end(string::const_iterator b, string::const_iterator e) { return find_if(b, e, not_url_char); } bool not_url_char(char c) // URL에 나타날 수 있는 문자들 static const string url_ch = "~;/?:@=&$-_.+!*'(),"; // c가 URL에 나타날수 있는 문자이면, false리턴 return !( isalnum(c) || find(url_ch.begin(), url_ch.end(), c) != url_ch.end()); 15

url_beg() 함수 text http://www.acceleratedcpp.com more text beg i string::const_iterator url_beg(string::const_iterator b, string::const_iterator e) { static const string sep = "://"; typedef string::const_iterator iter; // i marks where the separator was found iter i = b; while ((i = search( i, e, sep.begin(), sep.end())) != e) { // make sure the separator isn't at the beginning or end of the line if (i != b && i + sep.size() != e) { // `beg' marks the beginning of the protocol-name iter beg = i; while (beg != b && isalpha(beg[-1])) --beg; // 식별자 앞과 뒤에 최소한 하나의 적절한 문자가 있으면 if (beg != i && !not_url_char(i[sep.size()])) return beg; } // the separator we found wasn't part of a URL; // advance i past this separator i += sep.size(); return e; 16

알고리즘 search() search(b, e, pb, pe) search( i, e, sep.begin(), sep.end())에서 찾았으면, [i, e)사이에서 ‘:’의 위치를 리턴. 못 찾았으면, 두번째 반복자 e를 리턴한다. 컨테이너가 인덱싱을 지원하면, 반복자도 인덱싱 지원한다. beg[-1] *(beg-1)와 같음 i[sep.size()] 식별자 :// 뒤의 문자 *(i+sep.size())와 같음

URL찾기- main()함수 int main() { string s; while( getline(cin, s) ) { vector<string> v = find_urls(s); for (vector<string>::const_iterator i = v.begin(); i != v.end(); ++i) cout << *i << endl; } return 0;

알고리즘 find() 사용 예 int num_to_find = 3; vector<int> v1; for( int i = 0; i < 10; i++ ) { v1.push_back(i); } vector<int>::iterator result; result = find( v1.begin(), v1.end(), num_to_find ); if( result == v1.end() ) { cout << "Did not find any element matching " << num_to_find << endl; else { cout << "Found a matching element: " << *result << endl;