딱히 문제가 있어서가 아니라 단순히 저장 용으로…
알고리즘을 풀거나 기타 코딩을 하다보면 특정 숫자를 입력받아야 하는 경우가 생긴다.
흔히 int형 배열, 예를 들어 int num[10]과 같이 정해진 숫자를 입력받는 것은 1학년 C언어 시간에 아주 많이 해보았을 것인데
정해지지 않은 수 만큼 입력받는 것에 대해서는 생각해 본 적이 없어 복습 차 구현해보았다.
물론 더 쉬운 Toknizer나 stringstream을 사용할 수 있는 방법도 참고한다
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string strInput; // 띄어쓰기 기준으로 N개의 수를 입력받을 String
vector<int> vecNum; // 입력받은 N개의 수를 저장할 Vector
// 숫자 입력 받기
cout << "숫자를 입력하세요 : ";
getline(cin, strInput);
// 문자열 출력
cout << "문자열 : " << strInput << endl;
string strNum = ""; // 각각의 숫자를 저장할 임시 String
for(int i = 0; i < strInput.length(); i++)
{
if(strInput.at(i) == ' ')
{
// 현재까지 저장한 문자(숫자)들을 Vector에 추가 후 String 초기화
vecNum.push_back( atoi(strNum.c_str()) );
strNum = "";
}
else
{
// 띄어쓰기가 나올 때까지 문자 더함
strNum += strInput.at(i);
continue;
}
}
vecNum.push_back( atoi(strNum.c_str()) ); // 마지막 숫자도 벡터에 추가
cout << "숫자 : ";
for (int i = 0; i < vecNum.size(); i++)
{
cout << vecNum[i] << " ";
}
cout << endl;
return 0;
}
cout 출력문과 엔터가 많아 코드가 길어보이는데 실제로 중요한 부분은 19~35라인이다.
먼저 띄어쓰기 단위로 숫자를 입력받기 위해 그 전체를 문자열로 생각하였다.
예를 들어 11 22 33 44 55[엔터]를 입력하면 숫자 11, 22, 33, 44, 55가 아닌 11~55까지 전체를 문자열로 생각한 것이다. 물론 띄어쓰기는 포함해서.
그리고 나서 시작 지점부터 띄어쓰기가 나올 때까지 임시 string인 strNum에 숫자를 저장한다.
그러다 띄어쓰기가 나오면 strNum에 있는 숫자를 vecNum에 저장하고(push_back) strNum을 초기화한다. 다음 숫자를 저장하기 위해서.
참고로 string 클래스를 int로 변경하기 위해서는 atoi를 사용하는데, atoi의 인자가 char*형이다.
따라서 String클래스의 c_str()를 사용하여 char*로 변환해준 것이다.
위의 경우 11다음에 나오는 띄어쓰기, 22다음에 나오는 띄어쓰기 등이 조건에 해당될 것이다.
'Algorithm' 카테고리의 다른 글
멀리 뛰기 – 수열 알고리즘 (0) | 2018.12.27 |
---|---|
최소자승합(제곱의 합) 구하기 (0) | 2018.12.27 |
시저 암호 (0) | 2018.12.27 |
행렬의 곱셈 (0) | 2018.12.27 |
2016년 요일 구하기 (0) | 2018.12.27 |