인프런 커뮤니티 질문&답변

조상범님의 프로필 이미지
조상범

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

3-C

3-C 속도 차이 질문드립니다

해결된 질문

작성

·

451

·

수정됨

0

http://boj.kr/7b6776aa9c9545e58d94059272172eb9

안녕하세요 선생님.

3-C에서 저는 BFS를 통해서 구현하여 해결한 후, 강의를 통해 선생님 코드와 비교하며, 여러 구현방식을 익히는 중에 궁금한 점이 생겨서 질문드립니다.

강의에 나온 코드는 검색 로직이 DFS로 구현되어 있는데, 제 코드의 검색 로직은 BFS인것만 제외하면 선생님 코드와 별 차이가 없다고 생각했습니다.

그런데 막상 코드를 돌려보면

제 코드의 시간은 164ms~172ms가 나오는 반면, 선생님의 코드는 88ms정도로 거의 90%가까이 빠르게 나옵니다.

왜 이렇게 시간차이가 많이나는지 이해가 안는데 왜 그런지 여쭙고 싶습니다.

(현재 여러 시도를 해보긴 했는데 오히려 더 느리게 나오고 잘 모르겠네요...ㅠ

27,40번째 line의 중복 삽입 수정 버전 442ms

http://boj.kr/7fabb13a2ca441bda6e8591670ef9621

함수 제거 버전 172ms

http://boj.kr/312e0d4df77c45219e46da19cc649e05
)

답변 1

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 상범님ㅎㅎ

먼저 시간비교를 하면서 좀 더 좋은 코드를 연구하는 것은 올바른 자세입니다.

다만, 너무 가중치를 두진 마시구요 ㅎㅎ

자, 그럼 볼까요?

시간의 차이는 조금 더 효율적인가? 에 대한 부분에 있습니다.

442ms의 코드입니다.

bool visited[50][50];
vector<set<pii>> v;

set을 사용하고 있는데요. 굳이 중복 삽입에 set을 사용하지 않아도 이 문제는 풀 수 있습니다.

불필요한 자료구조 및 로직이 들어가는 것이죠.

 

172ms 코드입니다.

원래는 nx, ny로 했었는데 수정해봤습니다. 원래는 y, x로 해야 맞는데 상범님 코드처럼 x, y로 해도 맞았는데 변수명만 바꾸신건가요..?

                    pii p=q.front();q.pop();
                    for(int i=0;i<4;i++){
                        int ny=p.first+dy[i];
                        int nx=p.second+dx[i];

담부터는 y, x를 기반으로 이어가주세요(문제에서 x, y로 설정하지 않는다면요.)

해당부분은 교안의

2차원배열과 탐색을 빠르게 하는 팁

을 참고해주세요.

코드는 전부 확인해봤으며 문제 없습니다.

불필요한 로직 또한 없습니다.

제코드가 더 빠르다고 해서 무조건 DFS가 BFS보다 빠른 것은 아닙니다.

문제에 따라 상이하지만, 코드수를 기준으로 봤을 때는 DFS가 BFS보다는 코드수가 적어서 그런거 같습니다만(코드 한줄 한줄은 컴퓨터의 자원을 쓰는 cost니까요.)

but, 그렇게 상관할 바는 아닙니다. ㅎㅎ 잘 짜셨습니다. :)

 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제가 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

 

 

조상범님의 프로필 이미지
조상범
질문자

답변 감사드립니다.

x,y는 제가 이전부터 x,y로 쓰던게 손에 익어있고

해설을 이해하는데도 크게 문제가 없어서

변수명은 바꿔서 저렇게 사용하고 있습니다

조상범님의 프로필 이미지
조상범

작성한 질문수

질문하기