wurikiji   4년 전

아래 첨부한 코드가 20ms 로 통과하는 코드 입니다. 

여기서 

string c;

선언부를 문제의 한계점에 맞춘 char c[600001]; 배열로 바꿀경우 

수행시간이 1600ms 로 급격하게 늘어나는데, 해당 현상에 대한 설명을 볼 수 있는 참고자료가 있을까요? 

감사합니다. 


plzrun   4년 전

저는 그런 차이는 모르겠는데

일단 cout << endl;은 쓰지 않는게 좋아요.

코드에서 한번만 쓰시긴하는데

아무튼 endl쓰면 개행하면서 쓸데없이 출력버퍼까지 비우니까 ps에선 interactive programming이 아닌 이상 금지어죠.

(알고 쓰셨다면 할말은 없는...)


그리고 cout 쓰시려면 cin.tie(0); 쓰셔야 해요 (안그럼 많이 느려요.. cin때문에 ios::sync쓰셨을텐데, 이 구문 쓴 의미가 없어져요.)

printf쓰시면 cin.tie(0)안쓰셔도 됩니다.

ios::sync_with_stdio(false); 하신다음에 cin.tie(0);도 같이 써주세요.

cin과 cout이 서로 가리키고 있나? 막 그랬는데 그걸 풀어준다고 생각하시면 돼요. (자세한건 검색.. ㅋ)



질문과는 상관없는 얘기였는데 그냥 지나가다가 댓글달아봐요.

접근속도 차이라는게 정확히 뭔지 잘 모르겠네요. 그런 차이가 있다해도 절대 저정도로 차이날 리가 없는데...

아무래도 char배열 쓰신 코드를 같이 올려주셔야 코드 문제가 뭔지 알 수 있을거 같아요.


---------------------------------------------------------------------------------------------------------------------------------------------------------

아! 생각해보니 요즘 BOJ가 64비트 환경으로 바뀌고 난 다음부터 이상해졌어요.

그래서 가끔가다가 cin이 scanf랑 저만큼이나 속도 차이가 나는 경우가 있더라구요. (갑자기 이상해짐)

내부적으로 문제가 생긴듯 한데, 그냥 BOJ만의 문제라고 생각하시면 될거 같아요.

저번에 저도 다른 문제 풀다가 그런 경우를 봤는데 백준님도 원인을 모르시는거 같아요.

plzrun   4년 전

위의 글 작성자인데.. BOJ에서 요즘 scanf가 이상하게 느릴때가 있어요. (고쳐지길 기다리는 수밖에...)

위의 글을 생각나는대로 쓰다보니 이상해져서 결론만 다시 올려요 ㅎㅎ;

wurikiji   4년 전

위엣분 댓글 달아주셔서 기타 정보도 추가로 얻었네요 감사합니다 :)

char 쓰는 코드도 올렸어야 했는데 깜빡하고 올리지 않았네요 ㅠㅠ 죄송합니다. 

몇번 테스트 하면서 자체적으로 결론을 찾았습니다.

처음 stack 에 push 할때의 for문의 조건절에 i <  strlen(c) 형태로 매번 strlen() 함수를 호출하도록 코드를 짜서 발생하는 문제였습니다.. 멍청 ㅠㅠ 

int len = strlen(c); 로 미리 변수에 받아논 이후에 for문의 조건절을 i < len 으로 바꾸니 수행시간 문제가 해결되었습니다. 

추가 정보를 주신 @plzrun 님께 다시한번 감사드립니다. 

댓글을 작성하려면 로그인해야 합니다.