알고리즘 문제 풀이: 파이썬/Programmers

[프로그래머스] 무인도 여행

hueco 2023. 11. 7.

 

📌 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/154540

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

내 풀이(Success) :

 

🧐 Review:

 전형적인 그래프 탐색 문제이다. 이런 유형은 많이 풀어서 그냥 읽자마자 풀이가 떠오르는 것 같다.

 

파이썬으로 알고리즘 문제를 풀 때 함수 안에 함수를 중첩해서 정의하는 코드를 별로 좋아하지 않는다. 왜냐하면 코드를 읽으면서 함수의 흐름을 따라가다가 갑자기 다른 함수의 정의 부분이 나오는 것이 어색하다고 생각한다. 함수는 각각 정의하고, 필요한 값이 있다면 파라미터를 통해 값을 전달해야 한다고 생각하기 때문이다. 그래서 문제를 풀 때 bfs 함수는 일반적인 bfs로직과 결과를 반환하는 변수만 사용하고, 그 외에 변수는 해당 함수의 외부에 정의해서 사용하도록 코드를 작성하는 것을 선호한다.

 여기서 백준과 프로그래머스의 문제 풀이의 차이점이 있는데, 백준은 입력값을 사용자가 직접 받아야 하기 때문에 따로 solution 함수를 작성하지 않고, bfs 함수만 작성해서 푼다. 그래서 bfs 함수를 호출하는 시점에는 해당 함수는 필요한 변수를 모두 알고 있게 된다. 그래서 변수를 전역으로 선언하거나 파라미터로 넘겨주지 않아도 된다. (변수 자체가 전역이기 때문에)

 하지만, 프로그래머스에서는 solution 함수에 입력값이 들어오므로 해당 함수를 반드시 사용해야 한다. 그래서 위의 코드처럼 각각 함수를 정의해서 사용하면 bfs 함수에서 solution 함수에 정의한 변수를 알지 못하게 된다. 이때, 필요한 값을 모두 파라미터에 넘기면 함수의 정의 부분이나 호출 부분이 길어지기 때문에 나는 필요한 변수를 전역으로 두고 사용하는 것을 선호한다. 

 

어떤 방법을 선택할지는 개인의 선택이라고 생각하지만 적어도 전역 변수를 사용한다면, 변수를 전역으로 선언할 때 사용하는 global 키워드와 해당 변수의 적용 범위는 알고 사용하는 것은 필요하다는 생각이 든다.

 

이 문제를 풀면서 global 키워드에 대해서 다시 한번 정리할 수 있었다. 그리고 maps는 solution 함수의 파리미터로 넘어오는 지역 변수이기 때문에 solution 함수 안에서 다시 전역으로 변경할 수 없다. 그래서 bfs 함수에 파리미터로 값을 전달하도록 코드를 작성했다.

 

댓글