pianojay   4년 전

저는 다음과 같이 코딩했는데요,(문제는 맞았습니다.)

스택을 이렇게 구현하는 게 효율적인지 잘 모르겠습니다.

한번 검토해 주실 수 있을까요?

(모범적인 구현 방법에 대한 팁도 있으면 좋을 것 같아요)

1207koo   4년 전

저라면 이 코드처럼 최적화 했을 것 같습니다. (실행해본 것도 아니고 그냥 바꿔본거라 더 느릴 수도 있습니다.)

일단 s를 전역변수로 두어서 계속 변수를 새로 선언하는 것을 줄였고,

전역변수는 자동으로 0으로 초기화되므로 초기화를 지웠습니다.

버퍼 지우기는 아마 제가 알기로 " %s"와 같이 앞에 공백을 붙이면 되었던 것 같아서 했습니다.(안 될 수도...)

그리고 if else가 너무 많아서 switch를 쓰긴 썼는데, switch을 생각만 해보고 시간을 비교한 적은 없어서 모르지만 switch문이라면 차례대로 비교하진 않도록 최적화할 수 있을 거라고 생각했습니다.(물론 가능성일 뿐이고, break까지 해주어야 하는 등 오히려 더 느릴 수도 있습니다. 그래도 가동성이나 의도한 거를 보여주는 용도로는 좋은 것 같습니다.)

그리고 b를 지우고 바로 입력받은 수를 그 위치에 넣도록 했습니다. c[top]에 넣고 top++를 하기 위해 c+top++라고 썼습니다. 이러면 c[top]의 주소가 결과가 되고, (=&c[top])top++가 된다고 생각하는데, 우선순위를 안 외워서 꼬일 수도 있습니다.

그리고 pop에서는 c[--top]로 top--와 c[top]을 합쳤고, 삼항 연산자를 이용해서 압축시켰습니다.

empty에서는 !top을 출력하게 했습니다.

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

어차피 시간 복잡도는 같고, 딱히 비효율적으로 짠 건 없기 때문에 사실 그냥 위 코드처럼 계속 짜셔도 될 것 같긴 합니다.

그냥 전역변수는 0으로 자동으로 초기화하니까 ={}나 =0같은 거는 안 써주셔도 된다는 거, 계속 사용하는 변수(여기서는 s)는 밖에 선언해서 계속 다시 선언하지 않도록 하기

이 정도만 해주시면 될 것 같습니다.

pianojay   4년 전

전역 변수는 자동으로 0으로 초기화 되는 군요. 이게 동적 메모리를 선언한 경우에도 해당하나요?

그리고 버퍼 비우는 과정은 좀 더 알아봐야겠네요. 매번 문자열 다룰 때마다 에러를 뿜어서...

계속 이 방향으로 코드를 짜도 될 것 같아 보이네요. 좋은 피드백 감사합니다.

1207koo   4년 전

동적 메모리는 상황에 따라 다른 것으로 알고 있습니다.

malloc인가 calloc인가 둘 중 하나만 0으로 초기화했던 것 같고(전역변수로 넣을 수는 없지만)

vector나 stack, queue 등은 size가 0인 빈 상태로 할당이 됩니다.(이건 지역이어도 같을 겁니다. size를 바꾸는 등의 작업은 모르겠네요. 아마 0으로 초기화할 거라고 생각합니다.)

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