나 개발자 진짜 되냐?

백준 C++ 9093번 단어 뒤집기 ( getline, stringstream ) 본문

C++을 시작해봐요!/구현문제를 풀어봤어요!

백준 C++ 9093번 단어 뒤집기 ( getline, stringstream )

Snow Rabbit 2026. 1. 28. 23:43

 

오늘은 가족끼리 마트에 다녀왔다!

오랜만에 다같이 가니 살게 많았달까..ㅎ

 

요즘 물가가 너무비싸서..

딸기..만이천원..

오렌지 만원...

세상에..돈이 돈이 아니다.

 

 

자! 오늘은 단어를 뒤집어보자!


 

문제를 읽어보았을때는 생각보다 어렵지 않다고 느껴졌다.

 

쪼금 헷갈리는건.. 공백도 구분해야하고 엔터도? 구분해야한다는 것이다.

이 한문장이 끝났다는걸 어떻게 알려줘야하지? 가 내 의문점이였달까?

 

일단 줄바꿈이 있으면 while문 다시돌기

그리고 글자를 벡터에 담아서

벡터 길이만큼 돌면서 글자 뒤집어주고 다시 새로운 벡터에 저장

그리고 출력

이 계획이었는데

 

reverse한 값을...어떻게 해야하는건지? 잘 모르겠고

reverse가 됐는지도 모르겠다 ㅋㅋ

 

 

망해버린 식..

 

제씨에게 찾아가니

나에게 두가지 친구를 소개시켜주었다.

getline 과 stringstream ..

사실 이거 두개를 힌트로 받으니..

문제를 풀었던거 같은? 느낌도 받았다..

2025.12.08 - [C++을 시작해봐요!/구현문제를 풀어봤어요!] - 백준 C++ 1152번 단어의 개수 ( getline, stringstream )

 

백준 C++ 1152번 단어의 개수 ( getline, stringstream )

맨날 알고리즘 알고리즘 노래만 부르다가...어느날 내가 풀었던 문제를 못푸는 불상사를 맞이하며..현타가 와서 새롭게 공부하기로 마음먹었다. 백준에 구현문제만 모아둔 곳에 가서일단 이 문

qua28.tistory.com

...

..이럴수가.. 얘도 단어의 개수네..

심지어 첫 대사가....새롭게 공부하기로....ㅋㅋㅋㅋㅋ

스읍..사람은 변하지않는걸까..

 

이 문자열 문제에 꼭 알아야할 친구라고

친해지라고 했다.

 

cin의 경우 공백이나 tab키에 입력을 끊어버리기 때문에

문장 전체를 받기 위해 우리는

getline을 사용하게 된다.

 

이 친구는 엔터를 만나면 ( \n < 이거 )

멈추고

그전까지 있던 모든 공백들조차 가져온다.

 

문법은 

getline ( cin, s )라고 하며

문장 한줄을 통째로 가져오겠다.

 

이 getline으로 문장을 통으로 가져왔다면

우리는 다시 쪼개줘야한다.

그러는 친구가 이 stringstream 이다.

 

stringstream ss (s) 라고 하며

ss라고 부르고 문자열 s를 가져올거야.

ss는 가상의 입력장치가 되며,

ss >> word

해주면 cin처럼 작동해서 word에 s 문장을 공백으로 쪼갠 값이 하나하나 들어가게 된다.

 

자,

그리고 가장 중요한게 있다.

 

int T, cin T; 를 해주고

cin.ignore()를 해주어야한다고 한다.

 

이 친구가 뭐길래?

 

cin은 아까 공백에서 끊어낸다고 했다.

근데 컴퓨터에는 cin을 하고 값을 받아오면 끝에 '\n'를 가지고 있다고 한다.

근데 이게 있으면 getline에서 어머나? 앞에 이게있네 하며

글자가 없는데 그냥 끊어버리는 사고가 나기때문에

미리미리 예방차원에서 엔터를 청소해줘야한다고 한다.

 

그래서 여튼! getline을 쓸때에는 ignore를 꼭 써줘야한다!

 

 

이렇게 해주면 된다!

 

제씨는 나에게 스택으로 푸는 방법도 있다고 했다.

생각해보니 그렇다.

스택은 먼저 넣은애가 나중에 나오기 때문에

글자를 넣고..다시 빼면? 되긴하겠다는 생각이 들었다.

 

getline은 그대로 하되,

ss를 사용하는것이 아니라 스택을 써서

line 에서 한글자씩 글자를 스택에 넣는다.

 

내가 맨처음에 풀었던거처럼

엔터가 나오면

그때부터 하나씩 쌓아놓은것을 출력하고 pop하고

스택이 다 비워지면 공백을 출력하고 탈출.

 

#include <bits/stdc++.h>
using namespace std;

int main(void) {
    int T;
    cin >> T;
    cin.ignore();

    while (T--) {
        string line;
        getline(cin, line);
        line += ' '; // 문장의 끝 처리를 위해 마지막에 공백 하나 추가

        stack<char> st; // 글자를 담을 스택

        for (char ch : line) {
            if (ch == ' ' || ch == '\n') {
                // 공백을 만나면? 스택에 쌓인 글자를 다 비우면서 출력!
                while (!st.empty()) {
                    cout << st.top(); // 맨 위 글자 확인
                    st.pop();        // 꺼내기
                }
                cout << ch; // 공백 출력
            } else {
                // 글자라면? 스택에 쌓기
                st.push(ch);
            }
        }
        cout << "\n";
    }
}

 

각자의 장단점이 있다고 한다.

 

한때 스택 공부하면서 많이 썼는데...ㅋㅋㅋㅋ

구현문제 한달동안 푸느라 까먹어버렸네 ㅎ

 


 

여튼 이제 확실히 기억해야겠...다..

이젠 진짜 기억하고 단어를 쪼갤 때 활용해야겠다.

 

사실 이제보니 저게 내 첫번째 구현문제였다.

 

12월 8일이니..

오늘 1월 28일 이니까

옆으로 한칸 땡겨졌네 ㅎ

12 / 8

1 / 28

ㅎㅎㅋㅋㅋ

 

음....벌써 한달반이 지났다.

 

내가 푼 문제도 벌써 30개가 넘었을거 같다.

뭔가 아직 부족한데...하루의 두문제를 풀어야하나 싶기도한데..

이 문제 하나 푸는데도 거의 두시간이나 걸렸단 말이요!

 

부족한게 많은 요즘

풀어도 풀어도 어려운 요즘

어떻게 나아가야할지 모르겠는 요즘

 

불안은 내가 진심이라는 증거다.

내가 오늘 진심이였다면 그걸로 됐다.