- [ 장르 ] 스택
- Code 1 ( 입력 문자열 기능비교시 string.compare(string) 사용한 경우 )
// string.compare(string) 사용한 경우
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main()
{
int cnt,data;
stack<int> s;
string str;
//char str[5];
cin >> cnt;
for (int i = 0; i < cnt; i++)
{
cin >> str;
//scanf("%s", str);
if (str.compare("push") == 0)
{
cin >> data;
s.push(data);
}
else if (str.compare("pop") == 0)
{
if (s.empty())
cout << -1 << endl;
else
{
cout << s.top() << endl;
s.pop();
}
}
else if (str.compare("top") == 0)
{
if (s.empty())
cout << -1 << endl;
else
cout << s.top() << endl;
}
else if (str.compare("size") == 0)
cout << s.size() << endl;
else
{
if (s.empty())
cout << 1 << endl;
else
cout << 0 << endl;
}
}
}
- Code 2 ( 입력 문자열 기능비교시 strcmp(string1,string2) 사용한 경우 )
// strcmp(string,string) 사용한 경우
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main()
{
int cnt, data;
stack<int> s;
//string str;
char str[5];
cin >> cnt;
for (int i = 0; i < cnt; i++)
{
//cin >> str;
scanf("%s", str);
if (strcmp(str,"push") == 0)
{
cin >> data;
s.push(data);
}
else if (strcmp(str, "pop") == 0)
{
if (s.empty())
cout << -1 << endl;
else
{
cout << s.top() << endl;
s.pop();
}
}
else if (strcmp(str, "top") == 0)
{
if (s.empty())
cout << -1 << endl;
else
cout << s.top() << endl;
}
else if (strcmp(str, "size") == 0)
cout << s.size() << endl;
else
{
if (s.empty())
cout << 1 << endl;
else
cout << 0 << endl;
}
}
}
" C++에서 scanf,printf 와 cout,cin 의 차이가 있다. ! "
[ CheckPoint ]
- 일단, 문제는 말 그대로 스택에 기본적인 기능에 대해 구현하는 것이라서 어렵지 않다. 다만 pop이나 top을 할 때 항상 스택이 비어있는데 참조할려고 하지 않는지 empty를 통해서 사전에 방지해야한다.
그렇지 않으면 런타임 에러가 발생한다.- 그 외적으로, 문제를 풀면서 알게 된것은, 이 문제에서 스택에 기능을 영어 문자열로 입력을 받는데, 나는 최근까지 C언어를 많이 사용하다보니 문제가 쉬워보인다는 이유로 아무 생각없이 변수를 C++에있는 string변수로 선언하고 입력은 또 scanf( )로 받았다. 거기에 입력받은 문자는 각 "push","pop","top","size" 에 입력받은 문자열을 string container에 내장된 compare( ) 함수로 비교를 할려고 했다.
- 그러다 보니 아무리 제대로 문자열을 입력한 것 같아보여도, 결과적으론 문자열이 입력 받는거까진 좋은데, compare( ) 연산을하는데 이론상은 두 문자열이 같으면 0 을 반환하는 걸 이용해야하는게 그것이 적용이 안되는 것이다. 반대로 strcmp를 이용해 봤는데 이 역시 받아 들이질 않았다.
- 결론적으론, string변수를 쓴건 좋고, 그러면 입력과 출력을 C++의
cout 와 cin만 이용을하거나, strcmp를 쓰면 char 형태의 배열을 선언해서 scanf printf를 만을 사용해서, scanf,printf 와 cin,cout 간의 두 입출력함수가 동시에 쓰이는 경우를 없애야한다.- 이유는 혼동 되서 쓰이게 되면 싱크가 맞지 않아서 프로그램안에서 입력 순서가 바뀌는 참사가 발생한다고 한다.
[ 참고자료 ]- 추가적으로 프로그램 성능(실행시간)면에서 봤을 때, scanf,printf보다 cin,cout가 무거운 함수이다. 간단한 이유를 생각해보면, scanf,printf는 안에 형식들이 일일히 정해져서 들어가지만, cin,cout는 그냥 변수명만 넣기 때문에 컴파일러 내부적으로 이게 무슨 자료형이지 ? 등을 생각해야하기 때문에 당연히 속도적으로 느릴 수 밖에 없다.
저의 설명에 잘못됬거나 하는 것이 있다면 의견을 부탁드립니다.
728x90
반응형
'Algorithm Practice > [ Baekjoon ]' 카테고리의 다른 글
[Baekjoon][#10866] 덱(Deque) (0) | 2020.09.24 |
---|---|
[Baekjoon][#11729] 하노이 탑 이동순서 (0) | 2020.09.23 |
[Baekjoon][#18258] 큐 2 (0) | 2020.09.22 |
[Baekjoon][#1991] 트리순회 (0) | 2020.09.21 |
[Baekjoon][#11279] 최대 힙 (0) | 2020.09.20 |