DY N DY

실력키우기 단어집합(하)(C++) 본문

PARK/ALGORITHM

실력키우기 단어집합(하)(C++)

손세지 2016. 6. 30. 10:26

1535 : 단어집합(하)

제한시간: 1000 ms    메모리제한: 32 MB
해결횟수: 363 회    시도횟수: 908 회   



스트링을 입력 한 후, 스트링을 구성하는 단어들 중, 현재 단어목록에 포함이 되어있지 않은 단어를 단어목록의 가장 뒤에 추가하는 프로그램을 작성하시오.


(1) 처음에는 단어의 목록이 하나도 없다.
(2) 단어의 구분은 공백으로 한다.
(3) 스트링은 계속 입력받으며, 프로그램이 종료되지 않는 이상 기존의 단어들의 목록은 계속 유지된다. 
(4) 목록에 단어가 없을 경우 단어를 목록의 가장 뒤에 추가하고, 있을경우 추가하지 않는다.
(5) 단어목록에는 입력되는 순서대로 저장된다.
(6) 알파벳 대.소문자는 구분된다(다르다).

 

입력되는 스트링의 최대 길이는 50이하이며, 스트링은 최대 10개 이하이다.
하나의 결과가 나온 후에도 계속 새로운 입력을 받다가, 스트링 값이 "END"이면 프로그램을 종료한다.



현재의 단어목록을 공백으로 구분하여 한줄에 한번씩 출력한다.


 [Copy]
I am a boy
I am a girl
END
 [Copy]
I am a boy
I am a boy girl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**************************************************************
    Problem: 1535
    User: a132034
    Language: C++
    Result: Success
    Time:1 ms
    Memory:1772 kb
****************************************************************/
 
 
#include    <iostream>
#include    <string>
#include    <vector>
#include    <sstream>
using namespace std;
 
int main()
{
    string str;
    string res[10];
    vector<string> words;
 
    int len = 0;
    while (true)
    {
        getline(cin, str);
 
        if (str == "END")
            break;
 
        stringstream ss(str);
        string buffer;
        while (ss >> buffer)
        {
            bool isMatch = true;
            for (vector<string>::iterator it = words.begin(); it != words.end(); ++it)
            {
                if (*it == buffer)
                    isMatch = false;
            }
            if (isMatch)
                words.push_back(buffer);
        }
        for (vector<string>::iterator it = words.begin(); it != words.end(); ++it)
            cout << *it << " ";
        cout << endl;
 
    }
 
    return 0;
}


알고리즘보다는 사실 C++ 문법이 더 필요한 문제.. 였다. 

물론 stringstream, string, vector 이런것 없이도 풀 수 있었겠지만.. 아는건 써먹어야 하는법. 

string으로 그냥 받게되면 띄어쓰기를 인식하지 못하고 I am a boy를 입력하면 입력이 4번 된다. 때문에 getline함수를 이용해서 str변수에 line 전체를 받아왔다. 


둘째로 stringstream을 이용해서 split과 같은 효과를 주었다. C++ string은 split을 지원하지 않는다 하여.. 

stringstream 변수인 ss에 str을 넣어 초기화해주고, 

while문을 돌며 ss가 NULL이 아닐 떄 까지 buffer 변수에 넣어주었다. 

나머지는 현재 vector변수인 words에 넣을 단어가 있는지 확인한 후에 없다면 넣어주었다. 


stringstream에 대한 참조는 여기서..



'PARK > ALGORITHM' 카테고리의 다른 글

기초다지기 함수3-자가진단4(C++)  (0) 2016.06.30
기초다지기 함수3-형성평가3(C++)  (1) 2016.06.30
실력키우기 비밀편지(C++)  (0) 2016.06.29
실력키우기 참외밭(C++)  (2) 2016.06.29
실력키우기 타일교체(C++)  (0) 2016.06.28