문제
[백준] 단어순서 뒤집기
https://www.acmicpc.net/problem/12605
코드
#include <iostream>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
int main() {
int N; // 전체 케이스의 개수
cin >> N;
cin.ignore(); // 버퍼 비우기
for (int i = 1; i <= N; ++i) {
string line;
getline(cin, line); // 공백을 포함한 문자열 한 줄을 읽어 line이라는 문자열에 저장
istringstream iss(line); // line에 들어 있는 문자열을 스트림처럼 처리할 수 있게 함
vector<string> words; // 공백을 기준으로 분리한 단어들을 저장하는 벡터
string word;
// line 문자열에서 공백을 기준으로 단어 하나씩 읽어 words 벡터에 저장
while (iss >> word) {
words.push_back(word);
}
// 단어 순서를 뒤집기
reverse(words.begin(), words.end());
// 출력
cout << "Case #" << i << ": ";
for (int j = 0; j < words.size(); ++j) {
if (j > 0)
cout << " "; // 두번째 단어 이후부터 단어 사이에 공백 추가
cout << words[j];
}
cout << '\n';
}
return 0;
}
풀이
cin >> N;
으로 테스트 케이스 수를 입력받는다.cin.ignore();
로 버퍼의 남은 개행 문자를 제거한다.- 각 케이스마다
getline(cin, line);
으로 공백을 포함해 한 줄을 입력받고,istringstream
을 통해 공백 단위로 단어를 분리해words
벡터에 저장한다. - 벡터에 저장된 단어 순서를 뒤집고 출력한다.
🔎cin.ignore()
와 getline
, istringstream
을 사용하는 이유
1. cin.ignore();
코드의 첫 번째 입력 cin >> N;
는 테스트 케이스 수 N
을 입력받는다.. 하지만, 이때 N
을 입력한 후에 남아 있는 개행 문자('\n'
)가 입력 버퍼에 남아 있게 된다.
이 개행 문자를 제거하지 않으면 getline()
이 처음 호출될 때 빈 줄을 읽어버리게 되어, 의도한 입력을 제대로 읽지 못할 수 있다. 따라서, cin.ignore()
로 버퍼에 남아 있는 개행 문자를 제거해 주어 이후의 getline()
이 정상적으로 다음 줄을 읽을 수 있게 한다.
2. getline(cin, line);
getline()
함수는 표준 입력에서 한 줄 전체를 읽어 line
이라는 문자열에 저장한다.
cin
으로는 공백(스페이스)을 포함한 입력을 받을 수 없기 때문에, 한 줄 전체를 읽어야 하는 경우getline()
을 사용한다.getline()
은 개행 문자(\n
)를 만나면 읽기를 멈추고, 그 앞까지의 내용을 저장하므로 한 줄씩 입력을 처리할 때 유용하다.
3. istringstream
istringstream
은 문자열 파싱 함수 중 하나로, sstream
헤더에 포함되어 있다. 이를 통해 문자열에서 스트림처럼 처리해 단어 하나하나를 쉽게 분리해낼 수 있다.
istringstream iss(line);
는line
에 들어 있는 문자열을 스트림처럼 처리할 수 있게 만든다.- 이후
iss >> word;
를 사용하면line
문자열에서 공백을 기준으로 단어를 하나씩 읽어word
변수에 저장한다.iss
는 공백을 만나면 자동으로 다음 단어를word
에 저장해준다.
회고
몰랐던 C++ 문법들을 배울 수 있었던 문제였다.
'99클럽 TIL' 카테고리의 다른 글
99클럽 코테 스터디 15일차 TIL + 스택/큐(C++) (1) | 2024.11.12 |
---|---|
99클럽 코테 스터디 14일차 TIL + 스택/큐(C++) (0) | 2024.11.11 |
99클럽 코테 스터디 12일차 TIL + BFS(C++) (0) | 2024.11.09 |
99클럽 코테 스터디 11일차 TIL + DFS(C++) (0) | 2024.11.07 |
99클럽 코테 스터디 10일차 TIL + BFS(C++) (0) | 2024.11.06 |