miximum   2년 전

아래 코드를 보시면 

dfs A 안

dfs B 안

이 각각 있습니다.

전 처음에 B안을 먼저 생각하고 DFS를 사용하여  문제를 해결하려고 했고 테스트 케이스는 무난하게 통과하였습니다.

하지만 제출을 해보니 시간초과가 발생하였고 다른 방법인 A안을 채택하여 돌려보았더니 바로 성공하였습니다.

여기서 전 왜 시간초과가 났나 고민해보았는데 스스로 그 답을 찾지 못했습니다.

일단 제가 고민해본 내용과 답을 찾지 못한 이유를 말씀드리자면, main 함수 내에서 A안과 B안이 사용한 for문은 각기 다릅니다. A안은 모든 index를 거치면서 dfsA를 실행하였고, B안은 모든 index를 거치면서 field의 1,0 여부를 확인하고 1이면 dfsB안을 시행하였습니다. 제 단순한 생각으로는 컴퓨터가 dfsA를 실행하는 속도보다 filed의 1,0 확인이 더 빠르다고 계산하였습니다. 그래서 매 index마다 dfsA 함수를 한번씩 시행해보는 A안이 단순히 1,0 여부만 확인하고 나서 dfsB 함수를 시행하는 것보다 빠른지 이해가 가지 않습니다. 

혹시 주어진 test case 에서 압도적으로 1이 많다면 그런일이 발생할 수 있는건가요? 만약 그렇게 1의 갯수가 0보다 압도적으로 많게 된다면 한번의 시행만으로 대부분의 index가 0으로 바뀌게되기 때문에 처음부터 시행하는 A안이 더 빠르게 되는건가요? 또한 컴퓨터의 1,0 계산이 시간초과에 영향을 미칠정도로 큰 의미가 있나요? 정말 잘 모르겠습니다.. ㅠㅠ

dldyddlwl   2년 전

저는 B안 내니까 통과되더군요

miximum   2년 전

제가 뭘 잘못했을까요..?

확인 감사합니다 ㅎㅎ;

asz2325   2년 전

저도 B안 냈더니 통과되었습니다. 제출하셨던 오답 코드를 공유해주시면 한 번 확인해보겠습니다

miximum   2년 전

원본 코드의 B안이 제가 올린 B안이랑 조금 다른게 있었네요.. 귀중한 시간 써서 확인해주신 분들께 감사드립니다.

return값 유무 차인데 제가 B안을 제출할때 Ctrl + C , Ctrl + V 를 실수했나봅니다.

제 원본코드와 B안의 차이는 return값을 반환하냐 안하냐인데

그런데 이 return 값의 유무 차이가 큰 의미가 있는건가요? 물론 int형을 return 하는 함수이니 당연히 return값이 존재하는게 프로그래밍상 맞는 문법이지만 제 실수로 인해 들어가지 않은듯합니다.

B안에서 값이 field[y][x] 값이 0이면 return 값이 없어서 error가 나야 할텐데 시간초과가 먼저 발생해버려서 제가 캐치를 못한거같습니다. return 값이 존재하지 않음으로써 생기는 문제에 error를 제외하고 시간초과가 날 수가 있나요?

wak8835   2년 전

오랜만에 해당 문제를 보게 되니 살짝 반갑습니다.

일단 반환값이 정해져있는 (void가 아닌) 함수의 경우에 반환이 존재하지 않는 경우

정의되어 있지 않은 (예측할 수 없는) 결과를 수행하게 됩니다.

기본적으로 C/C++에서는 함수에 반환 type을 명시하지 않으면 int형을 반환한다 가정하고 빌드, 컴파일을 수행하게 되는데,

컴파일러마다 이 정의되어 있지 않은 동작에 대해 각기 다른 결과를 수행할 수 있습니다.

(MSVC에서는 반환 규칙을 강력하게 준수하기 위해, 컴파일 에러를 발생시켜 이러한 상황을 방지합니다.)

해당 문제를 간단히 해결하는 방법은 다음과 같습니다.

1. 반환할 값이 없는 함수인 경우 void 로 명시.

2. 반환값이 있는 함수의 경우에 (예외가 발생하지 않는 정상적 분기에서) return 을 수행할 수 있도록 조치.

wak8835   2년 전

위에 사설이 길었는데, 결론적으로 말씀드리자면 반환이 명시된 함수에서 반환 값이 없으므로 정의치 않은 일이 수행된 문제라고 보시면 됩니다.

예를 들어서 dfs 함수에 return 을 모두 지우시고, void 로 명시해두셔도 정상동작하실 겁니다.

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