인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

우상우님의 프로필 이미지
우상우

작성한 질문수

[자바/Java] 문과생도 이해하는 DFS 알고리즘! - 입문편

촌수계산 문제 질문

해결된 질문

작성

·

265

1

안녕하세요.

위의 코드는 제가 강의를 듣기 전에 작성한 코드입니다.

백준에서 2가지로 주어진 테스트 케이스는 통과하는데 코드를 제출하면 틀렸다고 나옵니다.

코드 어디가 잘못된지를 모르겠습니다.

그리고 강의에서는 dfs 함수에 start 변수만 넣지 않고 count 변수도 넣으셨는데 count변수를 매개변수로 넣지 않고 코드를 작성하는 방법이 있는지 궁금하고, 이러한 방법이 없다면 왜 매개변수로 count 변수를 넣어줘야 하는걸까요?

 

답변 1

1

우상우님 안녕하세요 :)

작성해주신 코드 봤는데 말씀하신 대로 answer라는 전역 변수 관리가 잘못 됐기 때문인 것 같아요.

작성하신 코드에서는 answer를 늘리기만 하고 줄여주는 부분이 없기 때문에
answer라는 변수는 "dfs함수가 호출된 횟수"가 되고 있어요.
즉, 지금 문제의 문맥에서는 "나와 연결된 가족의 수"를 세고 있는 것인데,
우리가 원하는 건 start와 end의 촌수를 계산하는 거라서, 전체를 세는 것이 아니라
거리 계산을 하고 싶은 겁니다.

그래서 해결책은 크게 2가지, 지금처럼 전역변수를 쓰는 방식과 제가 제시한 parameter를 사용하는 방식이에요.
전역 변수를 사용하시려면 dfs를 호출하는 조건문 안에 다음과 같이 answer--를 다시 해주는 부분이 필요해요.

answer++;
dfs(i);
answer--;

이렇게 다시 빼줘야지 거리라는 개념이 되고 전체 가족 수가 되지 않습니다.

 

이런 식으로 전역변수를 매번 더했다 뺐다를 반복하는 것이 코드도 복잡하고 성능도 떨어지기 때문에,
강의에서 설명 드렸던 방식대로 parameter를 전달하는 방식을 사용했어요!

인자로 전달하면 answer를 증감하는 동작을 생략할 수 있습니다.

 

그동안 해왔던 전역변수 증감하는 방식과 약간 다른 문제라서 이것도 한번 쭉 써보시고,
answer라는 값이 dfs 호출마다 어떻게 변하는지, 그래서 어떻게 두 노드 간의 거리를 계산하는지 보시면
조금 더 명확하게 이해할 수 있을 것 같습니다.

 

혹시 부족한 점 있으면 또 질문 남겨주세요! 감사합니다 :)

우상우님의 프로필 이미지
우상우

작성한 질문수

질문하기