본문 바로가기

알고리즘

문자열 뒤집기와벡터 순서 뒤집기

본 페이지는 C++ 독학을 위해 작성한 포스트입니다 풀이과정도 포함되어있지만 문법공부에 대한 비중이 있습니다.
(+  Java언어 내용도 포함되어있습니다. )

 

1.문제설명

- 임의의 문자열을 넣어 해당 문자열이 거꾸로 출력될 수 있는 알고리즘을 만든다.
- vector의 순서를 뒤에서부터 앞으로 순서를 재배치하는 알고리즘을 만든다 

 

2. 문제해결 접근

2_1) 스택을 이용한 문자열 뒤집기

 - 문자열의 각 문자를 스택에 push한 후, 다시 스택에서 문자를 하나씩 pop하여 문자열을 생성

 

문자열을 받아 담을 수 있는 stack을 선언한다.

해당 문자열을 하나씩 뽑아 정렬하여 문자열을 역순으로 정렬한다.

 

 

벡터 순서 뒤집기

 

 

vector값을 담을 수 있는 스택을 만든다

해당 스택에 vector값 원소를 하나씩 담은 뒤, 

스택에서 값을 꺼내어 vector를 재정의한다.

 

3.답안 : [언어 : ]

 

 

4. C++ 답안

#include <iostream>
#include <stack>
#include <string>
#include <vector>

using namespace std;

// 문자열 하나를 인자로 받아 , 뒤집은 문자를 반환하는 형태로구성
string reverse(const string& str)
{
	//stack 초기화 
	stack<char> stk;

	//for문으로 str의 문자를 로 받아 반복하여
	for (char c : str)
		// push로 stk에 넣어준다.
		stk.push(c);

	// 뒤집은 문자를 담아줄 변수 res를 선언
	string res;
	
	// stk가 빌때까지 반복한다
	while (!stk.empty()) {
		//res에 더해준다
		res += stk.top();
		// 그리고, stk의 문자를 하나씩 pop() 제거한다,.
		stk.pop();
	}

	return res;
}

template <typename T>

// vector 순서 뒤집기
void reverse(vector<T>& vec)
{
//	stack<T, vector<T>> stk(vec);	//아래의 3줄의 코드를 대체할 수 있는 코드이다
	
	 
	stack<T> stk;
	for (const auto& e : vec)
		stk.push(e);


	for (int i = 0; i < vec.size(); i++) {
		// vec[i]를 선언해주고, stk에서 원소를 하나씩 뽑아 담아준다
		vec[i] = stk.top();
		//담아준 stk원소를 하나씩 뽑아 제거해준다 -> pop()
		stk.pop();
	}
}

int main()
{
	string str1 = "HELLO";
	string str2 = "ALGORITHM";

	//str1과 str2를 각각 reverse()에 담아 
	cout << str1 << " -> " << reverse(str1) << endl;
	cout << str2 << " -> " << reverse(str2) << endl;

	// vector<int> vec {10, 20, 30, 40, 50};
	// reverse<int>(vec);
	
	vector<string> vec {"John", "loves", "Jane"};
	reverse<string>(vec);

	for (auto e : vec)
		cout << e << ", ";
	cout << endl;
}

 

5. C++ 문법 설명과 표현법