본문 바로가기
Algorithm(코딩테스트)/스택&큐&덱

[백준] 17413 단어 뒤집기 (C++)

by 디지털 전산일지 2024. 2. 8.

문제

 

문제 분석

- 문자열의 substr 함수를 이용해도 되고 deque을 이용해도 된다. 필자는 deque을 이용하여 풀이했다.

- 입력을 받을 때 띄어쓰기를 입력 종료로 받아들여지면 안되므로 getline으로 입력받는다.

 

- '<' 문자열이 나오면 이전 단어는 반대로 출력 + reverse_flag = false; 을 진행한다.

- '>' 문자열이 나오면 이전 단어는 그대로 출력 + reverse_flag = true; 을 진행한다.

- ' ' 문자열(띄어쓰기)이 나오면 reverse_flag 조건에 맞게 출력해준다.

- 일반 문자열이 입력되면 deque에 push 해준다.

 

- 단어를 그대로 출력하려면 front() 순서대로 출력해주고, 단어를 반대로 출력해주려면 back() 순서대로 출력해주면 된다.

 

- 이때 문제의 조건 2번에서 '문자열의 시작과 끝은 공백이 아니다.' 이므로 마지막 단어가 deque에 남게 될 수도 있다. (즉, 마지막 단어가 출력되지 않을 수 있다.) 그러므로 마지막 단어 출력을 reverse_flag 조건에 맞게 한 번 수행하면 된다.

정답 코드

// 풀이 시간 : 27분 50초

// 거꾸로 출력할 수도 있고 그대로 출력할 수도 있으므로 deque 자료구조를 사용하면 좋을 것 같다.

// < : 이전 단어는 반대로 출력 + reverse_flag = false; // 안에 있는 단어는 그대로 출력해주어야 함.
// > : 이전 단어는 그대로 출력 + reverse_flag = true;  // 단어는 뒤집어서 출력해주어야 함.

// 띄어쓰기가 나오면 (즉, ' ') 문자열을 reverse_flag 조건에 맞게 출력해준다.

#include <iostream>
#include <deque>
#include <string>
using namespace std;

deque<char> dq;

int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(nullptr);
	// 문장 입력받기
	string sentence;
	getline(cin, sentence);
	// 출력 방식에 맞게 문장 출력
	bool reverse_flag = true; // true : 단어를 거꾸로 출력
	for (int i = 0; i < sentence.size(); i++) {
		if (sentence[i] == '<') {
			// '<' 이전 단어까지는 반대로 출력
			while (!dq.empty()) {
				cout << dq.back();
				dq.pop_back();
			}
			cout << '<';
			reverse_flag = false; // 이후 단어 그대로 출력 모드로 변경
		}

		else if (sentence[i] == '>') {
			// '>' 이전 단어까지는 그대로 출력 
			while (!dq.empty()) {
				cout << dq.front();
				dq.pop_front();
			}
			cout << '>';
			reverse_flag = true; // 이후 단어 뒤집기 모드로 변경
		}
		// 띄어쓰기가 나오면 조건에 맞게 단어 출력
		else if (sentence[i] == ' ') {
			// 단어 그대로 출력
			if (reverse_flag == false) {
				while (!dq.empty()) {
					cout << dq.front();
					dq.pop_front();
				}
			}
			// 단어 반대로 출력 
			else if (reverse_flag == true) {
				while (!dq.empty()) {
					cout << dq.back();
					dq.pop_back();
				}
			}

			cout << " ";
		}
		// 일반 단어의 경우 deque에 push
		else {
			dq.push_back(sentence[i]);
		}
	}

	// 마지막 단어 처리
	if (reverse_flag == false) {
		while (!dq.empty()) {
			cout << dq.front();
			dq.pop_front();
		}
	}
	else if (reverse_flag == true) {
		while (!dq.empty()) {
			cout << dq.back();
			dq.pop_back();
		}
	}

	return 0;
}



교훈점

- 순서대로 출력, 역순으로 출력의 경우 deque을 사용하면 유용하다.