ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] 덱의 κ°œλ…κ³Ό STL Deque μ‚¬μš©λ²•
    Algorithm & Data Structure 2022. 1. 18. 22:47
    λ°˜μ‘ν˜•

    λ“€μ–΄κ°€λ©°

     λ±(Deque)은 Double Ended Queue의 μ•½μžλ‘œ 큐에 μ–‘μͺ½ λμ—μ„œ μ›μ†Œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ‚­μ œλ₯Ό ν•  수 μžˆλŠ” μžλ£Œκ΅¬μ‘°μ΄λ‹€. 그리고 C++ STL에 덱이 κ΅¬ν˜„λ˜μ–΄ μžˆμ–΄ μ‰½κ²Œ μ΄μš©ν•  수 μžˆλ‹€!

     

    덱(Deque) μ΄λž€?

    덱(deque, "deck"κ³Ό 발음이 κ°™μŒ ← double-ended queue)은 μ–‘μͺ½ λμ—μ„œ μ‚½μž…κ³Ό μ‚­μ œκ°€ λͺ¨λ‘ κ°€λŠ₯ν•œ μžλ£Œ ꡬ쑰의 ν•œ ν˜•νƒœμ΄λ‹€.
    두 개의 포인터λ₯Ό μ‚¬μš©ν•˜μ—¬, μ–‘μͺ½μ—μ„œ μ‚­μ œμ™€ μ‚½μž…μ„ λ°œμƒμ‹œν‚¬ 수 μžˆλ‹€. νμ™€ μŠ€νƒμ„ ν•©μΉœ ν˜•νƒœλ‘œ 생각할 수 μžˆλ‹€.

    - μœ„ν‚€λ°±κ³Ό

     

    덱

     λ±μ— λŒ€ν•΄μ„œ μ•„λž˜μ˜ 사진을 보고 μ΄ν•΄ν•΄λ³΄μž.

     μœ„ 사진을 보면 μ›μ†Œ 32λ₯Ό back에 λ„£μ–΄μ„œ 덱 μ•ˆμ— μ›μ†Œκ°€ 5, 17, 32κ°€ λ“€μ–΄μžˆκ²Œ λœλ‹€. μ—¬κΈ°μ„œ front에 μžˆλŠ” μ›μ†Œ 5λ₯Ό μ œκ±°ν•˜λ©΄ 덱 μ•ˆμ— 17, 32κ°€ λ‚¨κ²Œ λœλ‹€. 그리고 μ›μ†Œ 54λ₯Ό front에 λ„£μ–΄μ„œ 54, 17, 32κ°€ λœλ‹€. 그리고 back에 μžˆλŠ” μ›μ†Œ 32λ₯Ό μ œκ±°ν•˜λ©΄ 덱 μ•ˆμ— 54, 17이 λ‚¨κ²Œ λœλ‹€.

     

    덱의 μ„±μ§ˆ

    1.  μ›μ†Œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ›μ†Œλ₯Ό μ œκ±°ν•˜κΈ° μœ„ν•΄μ„œ O(1)의 μ‹œκ°„ λ³΅μž‘λ„κ°€ ν•„μš”ν•˜λ‹€.
    2.  μ œμΌ μƒλ‹¨μ˜ μ›μ†Œμ™€ 제일 ν•˜λ‹¨μ˜ μ›μ†Œλ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄μ„œ O(1)의 μ‹œκ°„ λ³΅μž‘λ„κ°€ ν•„μš”ν•˜λ‹€.
    3.  μ œμΌ 상단에 μžˆλŠ” μ›μ†Œμ™€ 제일 ν•˜λ‹¨μ— μžˆλŠ” μ›μ†Œλ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μ›μ†Œλ“€μ„ ν™•μΈν•˜κ±°λ‚˜ λ³€κ²½ν•˜λŠ” 것은 μ›μΉ™μ μœΌλ‘œ λΆˆκ°€λŠ₯ν•˜λ‹€. (ν•˜μ§€λ§Œ, STL Dequeμ—μ„œλŠ” 인덱슀둜 μ›μ†Œμ— μ ‘κ·Όν•  수 μžˆλ‹€. STL Stackκ³Ό STL Queueμ—μ„œλŠ” λΆˆκ°€λŠ₯ν•˜λ‹€!)

     

    STL Deque

     μ•„λž˜λŠ” deque 헀더 파일의 선언이닀.

    #include <deque>
    ...

     

    Deque μ„ μ–Έ

    #include <iostream>
    #include <deque>
    using namespace std;
    
    int main(void) {
    	
    	deque<int> DQ; // λΉ„μ–΄μžˆλŠ” int deque μ„ μ–Έ
    	
    	return 0;
    }

     

    Deque κ°’ μΆ”κ°€

     deque에 값을 μΆ”κ°€ν•˜κΈ° μœ„ν•΄μ„œ 두 가지 방법을 μ‚¬μš©ν•  수 μžˆλ‹€. 덱의 제일 μ•žμ— 값을 μΆ”κ°€ν•˜κΈ° μœ„ν•΄μ„œ push_front() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κ³ , 덱의 제일 뒀에 값을 μΆ”κ°€ν•˜κΈ° μœ„ν•΄μ„œ push_back() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€. 그리고 insert() ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ νŠΉμ • μœ„μΉ˜μ— 값을 μΆ”κ°€ν•  μˆ˜λ„ μžˆλ‹€.

    #include <iostream>
    #include <deque>
    using namespace std;
    
    int main(void) {
    	
    	deque<int> DQ; // λΉ„μ–΄μžˆλŠ” int deque μ„ μ–Έ
    	
    	DQ.push_front(1); // 1
    	DQ.push_back(2); // 1 2
    	DQ.push_front(3); // 3 1 2
    	
    	DQ.insert(DQ.begin() + 1, 5); // 3 5 1 2
    	
    	return 0;
    }

     

    Deque 크기

     deque의 크기λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” size() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€. 그리고 dequeκ°€ λΉ„μ–΄μžˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ empty() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

    #include <iostream>
    #include <deque>
    using namespace std;
    
    int main(void) {
    	
    	deque<int> DQ; // λΉ„μ–΄μžˆλŠ” int deque μ„ μ–Έ
    	
    	DQ.push_front(1); // 1
    	DQ.push_back(2); // 1 2
    	DQ.push_front(3); // 3 1 2
    	
    	DQ.insert(DQ.begin() + 1, 5); // 3 5 1 2
    	
    	cout << DQ.size() << '\n'; // 4
    	
    	if (!DQ.empty()) {
    		cout << "deque is not empty!" << '\n';
    	}
    	
    	return 0;
    }

     

    Deque κ°’ μ‚­μ œ

     deque에 값을 μ‚­μ œν•˜κΈ° μœ„ν•΄μ„œ 두 가지 방법을 μ‚¬μš©ν•  수 μžˆλ‹€. 덱의 제일 μ•žμ— μžˆλŠ” 값을 μ‚­μ œν•˜κΈ° μœ„ν•΄μ„œ pop_front() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κ³ , 덱의 제일 뒀에 μžˆλŠ” 값을 μ‚­μ œν•˜κΈ° μœ„ν•΄μ„œ pop_back() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€. 그리고 erase() ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ νŠΉμ • μœ„μΉ˜μ˜ 값을 μ‚­μ œν•  수 있고 clear() ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ 덱에 μžˆλŠ” λͺ¨λ“  μ›μ†Œλ“€μ„ μ‚­μ œν•  수 μžˆλ‹€.

    #include <iostream>
    #include <deque>
    using namespace std;
    
    int main(void) {
    	
    	deque<int> DQ; // λΉ„μ–΄μžˆλŠ” int deque μ„ μ–Έ
    	
    	DQ.push_front(1); // 1
    	DQ.push_back(2); // 1 2
    	DQ.push_front(3); // 3 1 2
    	
    	DQ.insert(DQ.begin() + 1, 5); // 3 5 1 2
    	
    	cout << DQ.size() << '\n'; // 4
    	
    	if (!DQ.empty()) {
    		cout << "deque is not empty!" << '\n';
    	}
    	
    	DQ.pop_front(); // 5 1 2
    	DQ.pop_back(); // 5 1
    	
    	DQ.erase(DQ.begin() + 1); // 5
        
    	DQ.clear(); // { }
    	
    	return 0;
    }

     

    Deque κ°’ 확인

     deque의 제일 μ•žμ— μžˆλŠ” μ›μ†Œμ˜ 값을 ν™•μΈν•˜κΈ° μœ„ν•΄μ„œ front() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κ³ , deque의 제일 뒀에 μžˆλŠ” μ›μ†Œμ˜ 값을 ν™•μΈν•˜κΈ° μœ„ν•΄μ„œ back() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€. 그리고 인덱슀λ₯Ό μ΄μš©ν•΄ μ›μ†Œμ˜ 값을 확인할 수 μžˆλ‹€.

    #include <iostream>
    #include <deque>
    using namespace std;
    
    int main(void) {
    	
    	deque<int> DQ; // λΉ„μ–΄μžˆλŠ” int deque μ„ μ–Έ
    	
    	DQ.push_front(1); // 1
    	DQ.push_back(2); // 1 2
    	DQ.push_front(3); // 3 1 2
    	
    	DQ.insert(DQ.begin() + 1, 5); // 3 5 1 2
    	
    	cout << DQ.size() << '\n'; // 4
    	
    	if (!DQ.empty()) {
    		cout << "deque is not empty!" << '\n';
    	}
        
    	cout << DQ.front() << '\n'; // 3
    	cout << DQ.back() << '\n'; // 2
    	cout << DQ[1] << '\n'; // 5
        
    	return 0;
    }
    λ°˜μ‘ν˜•
Designed by Tistory.