단어 뒤집기

NJW·2022년 4월 24일
0

코테

목록 보기
102/170

들어가는 말

다시 백준으로 돌아가기로 했다. 프로그래머스 level 2 카카오 기출 문제는 지금 실력에서 풀 수 있는 문제는 다 푼 듯하다(남은 문제 중 몇몇 개를 시도했고 풀이까지 봤지만 확실히 이해되는 문제가 없었기에). DFS, BFS 등은 아직 실력이 안 되는 것 같기에... 알고리즘 기초부터 꼼꼼하게 풀 생각이다.

문자를 거꾸로 출력하면 되는 문제다. 문제가 분류된 대로 스택을 사용하면 된다고 생각했다. 왜냐하면 2학년 때 자료구조 시간에 뒤로가기 기능을 스택을 사용한다고 배웠기 때문이다. 다만 주의할 점은 공백을 기준으로 단어만을 거꾸로 출력한다는 점이다.

코드 설명

백준 문제 답게 직접 입력을 받는 명령어를 추가헤줘야 한다.

그렇기에 먼저 몇 개의 문자를 받을지 아는 명령문을 넣어준다. 그 후 cnt만큼 문장을 받는데, 이때는 공백까지 받기 때문에 getlin() 함수를 써야 한다. 중요한 점! 입력 버퍼를 비워주기 위해 cin.ignore을 해줘야 한다(이건 내가 만든 make_test에서 알게 된 사실이다). 그렇지 않으면 '\n'이 남아 있게 되서 문장을 받지 않는다. 문장을 받고 나면 공백을 추가해준다. 왜냐하면 공백을 기준으로 출력을 할 건데, 마지막 문자는 공백이 없어서 s[j] == ' '의 조건에 해당되지 않기 때문이다. 물론 따로 출력해주는 방법도 있긴 하지만, 그렇게 하면 반복문을 한 번 더 써줘야 하기 때문에 그냥 공백을 넣어준다.

그 후 받은 문장을 처음부터 끝까지 검사하면 된다. 만일 공백이 나오면 스택이 빌 때까지 top을 출력하고 pop해주면 된다. 그리고 스택이 비어서 한 단어를 전부 거꾸로 뺐다면 띄어쓰기를 출력해서 한 단어임을 알려준다. 만일 문자가 공백이 아니라면 해당 문자를 스택에 넣어준다. 그리고 한 문장을 끝냈다면 endl 혹은 '\ㅜ'을 해주면 된다.

코드

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

using namespace std;

int main() {
	int cnt = 0;
	string s = "";
	stack<char> st;

	cin >> cnt;
	cin.ignore();

	for (int i = 0; i < cnt; i++) {
		getline(cin, s);
		s += ' ';

		for (int j = 0; j < s.length(); j++) {
			if (s[j] == ' ') {
				while (!st.empty()) {
					cout << st.top();
					st.pop();
				}
				cout << ' ';
			}
			else {
				st.push(s[j]);
			}
		}
		cout << endl;
	}

	return 0;
}
profile
https://jiwonna52.tistory.com/

0개의 댓글