일단 문제의 형태가 처음에 입력이 몇개 주어지는지 등에 대한 정보를 주지 않는 형태이다. 이런 유형의 문제는 처음 풀어보았는데,
이때에 이런 형태의 문제에서 언제까지 입력을 받아야 하는지에 대한 표현을 어떻게 하는지에 대해서 배울 수 있는 기회였다.
일단 참고 코드를 확인해보았을때 어디까지 처리해야 하는지에 대해서 정하는 부분은
while(true) {
....
if(cin.eof()==true) break;
...
}
형태처럼 cin.eof()이라는 함수를 통해서 처리하였다.
이때 eof이라는 함수를 처음 보아서 이 함수에 대해서 검색해보았는데,
위의 내용처럼
"eof() 함수는 스트림의 끝을 나타내는 EOF 플래그를 확인하여 스트림이 끝났는지 여부를 판단합니다" 라는 내용이 있다.
"cin.eof()는 'cin' 스트림 객체가 파일 또는 사용자 입력에서 더 이상 읽을 내용이 없을때 'true'를 반환하며, 그렇지 않은 경우
'false'를 반환한다." 고 한다.
이와 관련하여서 참고할만한 정보가 있는 블로그를 첨부해보면,
[C++] cin.eof()와 EOF(End of file)
EOF EOF(End of File): 파일의 끝, 더 이상 읽을 데이터가 없다 cin으로 입력을 받으려고 할 때, EOF라면 입력이 취소되고 cin.eof()는 true를 반환한다. 이를 이용하여 파일이 종료될 때까지 입력을 받는 코
c1oud9.tistory.com
이 블로그를 통해서
위와 같은 정보를 통해서, 파일을 넘겨주는 경우는 알아서 EOF 플래그를 만나서 eof() 는 true를 반환할것이고,
만약 터미널에서 직접 입력을 하는 경우는,
"터미널(콘솔)에서는 EOF를 수동으로 넣어주어야 한다.
windos:ctrl+z / Unix: Ctrl+d "
라는 부분을 통해서 볼때, 저 단축키를 통해서 EOF이라는것을 알려주어야 하고, 그걸 통해서 eof()함수가 동작해서 true를 반환할 수 있는 것으로 보인다.
다음에 혹시 이런식으로 입력이 몇개가 주어진다 하는 형태의 문제가 아니면, eof() 함수를 통해서 사용자 입력에서 더이상 읽을 부분이 없을때까지 실행되는 코드를 작성하는 것을 떠올려 보도록 하자.
https://lollolzkk.tistory.com/15
[C++] cin.eof() (파일 데이터를 끝까지 입력 받기)
cin.eof() 간혹, 알고리즘 문제에서 입력값의 범위가 주어지지 않는 경우가 있다. 이는 파일이 종료될때까지 입력을 받으라는 의미이므로, cin.eof()를 사용하면 된다. bool타입을 가진다. 만약 파일의
lollolzkk.tistory.com
이 블로그도 eof()에 대해서 언급하고 있는데,
이 블로그에서 작성되어있는 참고 코드를 보면
while(!cin.eof()){
...
}
형태로 작성하여서 EOF 를 만날때까지 코드가 돌도록 만들어 주었는데, 이런 형태로 코드를 작성해도 괜찮을것 같다.
==>아래 이런 형태로 코드를 변형해보았는데, 런타임에러(out of range)를 받게되었다. 이유가 무엇일까 생각해보도록 하자.
++++++++++++++++++++++
+++++++++++++++++++++++
while(!cin.eof()){
string c_time,name;
cin>>c_time>>name;
if(ttoi(c_time)<=st_t){
st_list.insert(name);
}
else if(ttoi(c_time)>=end_t && ttoi(c_time)<=stream_t){
if(st_list.find(name)!=st_list.end()){/*위와 같은 조건을 만족하는데,
그 조건을 만족하는 것이 st_list에 있다면, atd_list에 담는다.*/
atd_list.insert(name);
}
}
}
이렇게 작성하면 런타임에러(out of range)가 발생한다. 왜지?
while(true){
string c_time, name;
cin >> c_time >> name;
if(cin.eof() == true) break;
if(ttoi(c_time) <= st_t){
st_list.insert(name);
}
else if(ttoi(c_time) >= end_t && ttoi(c_time) <= stream_t){
if(st_list.find(name) != st_list.end()) {
atd_list.insert(name);
}
}
}
두 코드와의 차이점에 대해서 생각해보도록 하자.