안녕하세요, 여행벌입니다.

오늘은 자료구조 '스택' 과 C++ STL 스택 라이브러리를 이용하는 방법에 대해 다뤄보겠습니다.


1. 스택(Stack)

스택은 LIFO( Last In First Out ) 형식의 자료 구조로, 한쪽 끝에서만 자료를 넣고 뺄 수 있습니다.

즉, 마지막에 들어온 원소가 제일 먼저 나갈 수 있는 자료 구조입니다.

위의 그림과 같이, 스택의 Top 부분에서만 Push 와 Pop이 이뤄질 수 있습니다.

 

2. C++ STL 스택 라이브러리 기본 명령어

선언
- stack<자료형> 변수명 : 선언한 자료형 변수들을 담는 Stack을 선언.
ex) stack<int> s : int형 변수들을 담는 s라는 이름의 stack을 선언.

추가 및 삭제
- push(element) : top에 원소를 추가
- pop() : top에 있는 원소를 삭제

서칭
- top() : top(스택의 처음이 아닌 가장 끝)에 있는 원소를 반환

기타
- empty() : 스택이 비어있으면 true 아니면 false를 반환
- size() : 스택 사이즈를 반환

더 많은 함수들이 있지만, 위의 기본 명령어들만 잘 익히면 충분히 자료구조 Stack을 활용할 수 있습니다.

그럼 다음 예제를 통해 더 공부해볼까요?

#include<iostream>
#include<stack>

using namespace std;


int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0);

	stack<int> s; // int 형은 담는 s라는 이름의 stack 선언
	for (int i = 1; i <= 10; i++)
		s.push(i); // 1 ~ 10 까지 stack 에 담는다.
	for (int i = 1; i <= 10; i++) {
		cout << "현재 stack의 top : " << s.top() << '\n';
		s.pop();
	}
}

1 부터 10까지 차례대로 Stack에 담고 Pop 을 10번 시행해보겠습니다.

10(Top)

9

8

7

6

5

4

3

2

1

위의 그림과 같이 스택의 아래에서부터 Top까지 1 ~ 10 이 Push 되고, 이를 차례대로 Pop 한다면,

현재 stack의 top : 10
현재 stack의 top : 9
현재 stack의 top : 8
현재 stack의 top : 7
현재 stack의 top : 6
현재 stack의 top : 5
현재 stack의 top : 4
현재 stack의 top : 3
현재 stack의 top : 2
현재 stack의 top : 1

다음과 같이 출력될 것입니다!


오늘은 여기서 포스팅을 마치도록 하겠습니다.

자료구조 스택에 대한 기본적인 설명과 C++ STL Stack Library 기본 명령어를 정리해보았습니다.

 

안녕하세요, 여행벌입니다.

오늘은 C++로 수행 시간을 측정하는 '시간 초 재기' 코드를 구현해보겠습니다.


#include <ctime>

'ctime' Library를 이용해서 수행 시간을 측정할 수 있습니다.

#include<iostream>
#include<ctime>

using namespace std;

int main(void) {

	clock_t start, end;
	double duration;

	start = clock();
	/* 수행 시간을 측정하고 싶은 코드 */
	end = clock();

	cout << (double)(end - start) / CLOCKS_PER_SEC << '\n';
}

clock_t 변수와 clock() 함수를 활용해서, 시작 시간과 끝 시간을 저장해

서로 빼주면 그 사이의 수행 시간을 측정할 수 있습니다.


코드는 간단하지만 시간 측정은 내 알고리즘과 다른 분들의 알고리즘을 가시적으로 비교할 때 유용하게 사용할 수 있으므로,

익혀두면 좋을 것 같습니다!

안녕하세요, 여행벌입니다.

오늘은 자료구조 덱과 덱을 지원해주는 C++ STL deque library에 대해서 알아보겠습니다.


1. Deque(덱)이란?

Double-ended Queue의 약자로 Queue에 양쪽에서 삽입, 삭제가 다 이뤄질 수 있다는 점이 추가된 자료구조입니다.

Queue(큐)를 모르시는 분은 하단의 게시물을 먼저 봐주세요!

https://travelbeeee.tistory.com/7?category=807507

Deque(덱)은 다음과 같습니다.

Queue와는 다르게 Front 와 Rear 양쪽에서 삽입, 삭제가 다 이뤄질 수 있는 자료구조로 유용하게 사용할 수 있습니다.

 

2. Deque(덱) Library 기본 함수

#include <deque> // Deque(덱) Library를 불러온다.

다음과 같이 Library를 불러올 수 있습니다.

덱 기본 함수
 
선언
- queue <자료형> 이름;
ex) queue<int> dq;  // int형을 담을 dq라는 이름의 deque(덱)을 선언.

추가 및 삭제
- push_front(element) : 덱의 제일 앞에 element를 추가한다.
- push_back(element) : 덱의 제일 뒤에 element를 추가한다.
- pop_front() : 덱에 있는 원소 중 제일 앞에 있는 원소를 삭제한다.
- pop_back() : 덱에 있는 원소 중 제일 뒤에 있는 원소를 삭제한다.

서칭
- front() : 덱의 제일 앞에 있는 원소를 반환한다.
- back() : 덱의 제일 뒤에 있는 원소를 반환한다.

기타
- empty() : 덱이 비어있으면 treu 아니면 false를 반환한다.
- size() : 덱의 사이즈를 반환한다. ( 원소가 몇 개 들어 있는지 int 형을 반환 )

queue에서 앞, 뒤가 push, pop이 추가되었을 뿐 큰 틀은 바뀐 점이 없습니다!

#include<iostream>
#include<deque>

using namespace std;

int main(void) {
	deque<int> dq;
	for (int i = 1; i <= 5; i++) {
		if (i % 2 == 1)
			dq.push_front(i);
		else
			dq.push_back(i);
	}
	for (int i = 1; i <= 5; i++) {
		cout << dq.front() << '\n';
		dq.pop_front();
	}
}

다음과 같이 1 ~ 5 숫자 중 홀수면 front에 push, 짝수면 back에 push를 한다면,

deque(덱)에는 원소가 어떻게 담겨있을까요?

(front) 5 3 1 2 4 (back)

위와 같이 담겨있겠죠?


오늘은 deque(덱)에 대해서 알아보았습니다.

위의 기본 함수들만 익힌다면, deque(덱)을 이용해서 알고리즘 문제를 푸는데 전혀 지장이 없을 겁니다!

안녕하세요

여행벌입니다.

공부하느라 포스팅할 정신이 없어서

오랜만에 포스팅을 해봅니다!

오늘은 알고 있으면 정말 유용한

'삼항 연산자'에 대해서 포스팅을 해보려고 합니다.


삼항연산자는 다른 언어에는 없는, C와 C++의 특징인데요!

C++에서 유일하게 피연산자를 세 개나 가지는 조건 연산자입니다.

[문법구조]

'조건식 ? 반환값1 : 반환값2' 
의 형태입니다.

조건식이 참이면, 반환값1을

거짓이면, 반환값2를 return 해주는 연산자입니다.

예제를 통해서 익혀보도록 하겠습니다.

#include<iostream>

using namespace std;

int main(void) {
	int number1 = 11, number2 = 15;
	int max = (number1 > number2) ? number1 : number2;
	cout << max << endl;
}

number1 이랑 number2 중에서 더 큰 값을 출력해주는 프로그램인데요!

number1 > number2 가 참이라면, 반환값1인 number1을,

number1 > number2 가 거짓이라면, 반환값2인 number2를 반환함을 예상할 수 있습니다.

number1 에는 11이, number2 에는 15가 들어갔으므로,

number1 > number2 가 False가 되어, 출력값은 반환값2인 number2 가 됨을 알 수 있습니다.

만약에, 삼항 연산자를 사용하지 않았다면,

#include<iostream>

using namespace std;

int main(void) {
	int number1 = 11, number2 = 15;
	if (number1 > number2)
		cout << number1 << endl;
	else
		cout << number2 << endl;
}

if문을 이용해서 코드를 구현해야 할 것입니다.

삼항 연산자를 잘 익혀둔다면,  조금 더 보기 편하게 간결하게 코드를 구현할 수 있습니다.

알고리즘 문제를 풀다 보면, a 와 b가 있을 때, a와 b의 거리 차이를 구해야할 때가 많습니다.

즉, a-b의 절댓값을 구해야할 때가 많은데요!

이때, 삼항연산자를 사용한다면 절댓값 함수를 간단하게 구현할 수 있습니다.

바로 예제를 통해 보여드리도록 하겠습니다.

#include<iostream>

using namespace std;

#define abs(a,b) a > b ? a-b : b-a;

int main(void) {
	int number1, number2;
	cin >> number1 >> number2;
	int absolute = abs(number1, number2);
	cout << absolute << endl;
}

abs 함수를 a가 b보다 크면 a-b를 , a가 b보다 작으면 b-a를 반환하도록 삼항연산자를 이용해서 구현해봤습니다.

그러면 제가, number1에 15를 number2에 -5를 입력한다면,

number1이 number2보다 크므로 number1-number2인 20을 반환함을 예상할 수 있겠죠?

아래의 그림처럼 출력이 될 것입니다.

[입력]
15 -5
[출력]
20

이런 식으로 삼항 연산자를 이용하면 간단하게 절댓값을 구할 수 있어서

저는 자주 이용하는 편인 것 같습니다!


그럼 오늘은 여기에서 포스팅을 마무리하도록 하겠습니다.

나중에삼항 연산자에 대해서 더 다룰 내용이 생긴다면 이어서 포스팅해보도록 하겠습니다.

열심히 공부하고 노력하고 있는 꿈 많은 예비 개발자입니다.
혼자서 공부한 내용을 정리하고 포스팅하다보니 틀린 내용이 있을 수도 있습니다.
많은 조언과 가르침 주실분은 댓글로 자유롭게 남겨주셔도 좋을것 같습니다!
감사합니다.

+ Recent posts