영벨롭 개발 일지

[백준 BOJ][C++]17413번 단어 뒤집기2 풀이: Stack 본문

알고리즘 문제 풀이/BOJ

[백준 BOJ][C++]17413번 단어 뒤집기2 풀이: Stack

영벨롭 2022. 2. 16. 20:24

https://www.acmicpc.net/problem/17413

 

17413번: 단어 뒤집기 2

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져

www.acmicpc.net

 

 먼저 코드부터 보겠습니다. 

#include<iostream>
#include<cstring>
#include<vector>

using namespace std;


int main(void) {

	char str[100001]; //문자열 
	vector<char> buf; //단어 저장할 스택
	int j;
	int flag = 0;  //태그 사이임을 판별할 flag

	cin.getline(str, 100001); //공백 포함하는 문자열 입력

	for (int i = 0; i < strlen(str) + 1; i++) {
		if (flag == 1) {  //태그 사이라면 단어 뒤집기 X
			if (str[i] == '>')  //닫는 태그 만나면 flag 다시 0으로 
				flag = 0;
			continue;
		}

		if (str[i] == ' ' || str[i] == '<' || i == strlen(str)) {
			j = i - buf.size();  //str 내에서 각 단어의 첫 번째 index

			while (!buf.empty()) {
				str[j++] = buf.back(); //단어 다시 저장
				buf.pop_back();
			}

			if (str[i] == '<') //열린 태그 만나면 flag set
				flag = 1;
		}
		else {
			buf.push_back(str[i]);
		}

	}

	cout << str << endl;

	return 0;
}

 전체적인 풀이의 흐름은 9093번 단어 뒤집기 문제와 유사합니다. 

(9093번에 대한 풀이 링크는 글 하단에..)

 

 9093번은 단어 단위로 문자를 뒤집는 문제였다면, 이 문제는 태그(< >)사이에 있는 문자를 제외한 알파벳과 숫자로 이루어진 단어룰 뒤집는 문제입니다. 

 

 태그 사이에 있는 문자임을 판별하기 위해 int형 변수 flag를 선언하였습니다. 

 str[i]가 '<'이라면 열린 태그임으로 flag를 1로 set하고 닫는 태그 '>'를 만날 때까지 아무것도 하지 않아도 됩니다.  이때 닫는 태그를 만나면 다시 flag를 0으로 reset 해주어야 합니다. 

 코드의 나머지 부분은 9093번과 유사하기 때문에 링크를 통해 확인해주세요:)

 

 

https://iridescent-zeal.tistory.com/4?category=1261302

 

반응형