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

최준혁님의 프로필 이미지
최준혁

작성한 질문수

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

3-C

3-C 코드 질문 있습니다

해결된 질문

작성

·

294

0

큰돌님의 코드를 보면 앞선 코드들과는 다르게 visited와 v벡터 안의 값을 넣는 코드와 sum을 정하는 코드가 dfs 부르기 전에 있는 것을 볼 수 있었습니다. dfs 코드 내부에서도 if(abs(a[ny][nx]- a[y][x]) >= l && abs(a[ny][nx] - a[y][x]) <= r) 이 안에 visited, v.push_back, sum을 넣어 놓으셨는데 왜 dfs 부르고 바로 적지 않고 이런 식으로 해야되는건가요? 밑에 바꿔서 넣어봤는데 틀리더라고요 이유 설명 부탁드립니다.

http://boj.kr/00af894bac9844f7b1e5e3f2436f82fd

답변 2

0

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

안녕하세요 준혁님

준혁님 코드처럼 해도 로직은 똑같습니다.

다만, sum초기화가 빠졌습니다.

                if(!visited[i][j]){
                    v.clear();
                    sum = 0;

이렇게 해보시겠어요?

0

안녕하세요, 인프런 AI 인턴이에요. 제가 이해한 바로는, 큰돌님이 작성한 코드에 초점을 맞춘 질문이신 것 같아요. 예시로 주신 코드에서 visited, v 벡터의 값을 설정하고 sum을 정하는 코드가 dfs 호출 전에 위치하고 있습니다.

전형적인 DFS(깊이 우선 탐색) 알고리즘에서는 주로 재귀 함수를 사용해서 구현하는데, 이때 방문 여부를 확인하기 위한 visited 배열과 각 노드의 값을 저장하기 위한 v 벡터는 dfs 호출 전에 미리 초기화하는 것이 일반적입니다. 그렇게 하면 DFS가 시작되기 전에 필요한 데이터들을 모두 설정할 수 있기 때문에 코드의 가독성을 높일 수 있습니다.

또한 if 문 안에 visited, v.push_back, sum을 넣어놓은 이유는, DFS를 수행하면서 이웃한 노드를 방문하게 될 때 마다 visited 배열과 v 벡터에 값을 업데이트해야 하기 때문입니다. if 문의 조건이 충족되면 방문 여부를 체크하기 위한 visited 배열을 업데이트하고, 방문한 노드의 값을 v 벡터에 추가로 저장하고 sum 값을 업데이트합니다.

질문자님이 시도해본 방법이 틀렸다고 하셨는데, 정확한 이유는 코드를 보지 않고서는 파악하기 어렵습니다. 하지만 위에서 설명한대로 visited, v, sum 값을 dfs 호출 전에 미리 설정하는 것이 일반적인 방법이기 때문에 해당 방식으로 구현하셔야 합니다.

코드의 오류가 계속되신다면, 다시 한 번 코드를 살펴보시고 철자나 문법 실수, 다른 부분에 영향을 주는 다른 부분이 있는지 확인해보세요.

도움이 되셨길 바라며, 추가로 궁금한 점이 있다면 언제든지 물어보세요. 좋은 하루 되세요!

최준혁님의 프로필 이미지
최준혁

작성한 질문수

질문하기