프로그래머스 코딩테스트 연습 kit에 있는 DFS/BFS 문제를 풀어보았다.
🎱 프로그래머스 - 타겟 넘버
문제 설명
n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다.
사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.
제한사항
- 주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
- 각 숫자는 1 이상 50 이하인 자연수입니다.
- 타겟 넘버는 1 이상 1000 이하인 자연수입니다.
입출력 예
[1, 1, 1, 1, 1], 3 |
💡 BFS를 사용해서 부모 노드로부터 자식 노드로 내려오는 걸 구현한다.
STEP 1. 0부터 시작하여 부모 노드에 number를 더하거나 빼는 작업을 동시에 수행하여 자식 노드를 생성한다.
STEP 2. 해당 자식 노드를 다시 부모 노드로 치환해 위 작업을 반복 수행한다.
STEP 3. 이후 target값과 리스트를 비교해서 결과를 출력한다.
def solution(numbers, target):
answer = 0
leaves = [0]
for num in numbers:
tmp = []
for parent in leaves:
tmp.append(parent + num)
tmp.append(parent - num)
leaves = tmp
for leaf in leaves:
if leaf == target:
answer += 1
return answer
🎱 프로그래머스 - 네트워크
https://school.programmers.co.kr/learn/courses/30/lessons/43162
문제 설명
네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다.
컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.
제한사항
- 컴퓨터의 개수 n은 1 이상 200 이하인 자연수입니다.
- 각 컴퓨터는 0부터 n-1인 정수로 표현합니다.
- i번 컴퓨터와 j번 컴퓨터가 연결되어 있으면 computers[i][j]를 1로 표현합니다.
- computer[i][i]는 항상 1입니다.
입출력 예
3 | [[1, 1, 0], [1, 1, 0], [0, 0, 1]] | 2 |
3 | [[1, 1, 0], [1, 1, 1], [0, 1, 1]] | 1 |
입출력 예 설명
예제 #1
아래와 같이 2개의 네트워크가 있습니다.
예제 #2
아래와 같이 1개의 네트워크가 있습니다.
💡 DFS를 사용해서 트리의 개수를 구한다.
def solution(n, computers):
answer = 0
visited = [False] * n # 방문한 컴퓨터를 기록하기 위한 리스트
def dfs(i):
visited[i] = True # 현재 컴퓨터를 방문했음을 표시
for j in range(n):
if not visited[j] and computers[i][j] == 1:
dfs(j) # 연결된 컴퓨터를 재귀적으로 방문
for i in range(n):
if not visited[i]: # 아직 방문하지 않은 컴퓨터라면
dfs(i) # 해당 컴퓨터와 연결된 모든 컴퓨터를 방문
answer += 1 # 네트워크 개수를 1 증가
return answer
로직이 잘 이해가 되지 않아서 입력 예시를 통해서 살펴보았다.
3 [[1, 1, 0], [1, 1, 0], [0, 0, 1]]
🖍️ 처음에 visited 배열은 [False, False, False]입니다.
시작 컴퓨터 0을 선택하고 dfs(0)을 호출합니다.
dfs(0)은 컴퓨터 0을 방문 (visited[0]를 True로 설정)하고, 컴퓨터 0과 연결된 컴퓨터 1을 재귀적으로 탐색합니다.
이때 visited 배열은 [True, True, False]가 됩니다.
🖍️ dfs(1)은 이미 방문한 컴퓨터 1을 다시 방문하지 않으므로 아무 작업을 수행하지 않습니다.
한 네트워크의 탐색이 끝났으므로 answer를 1 증가시켜 네트워크 개수를 1로 업데이트합니다.
🖍️ 컴퓨터 2는 방문하지 않은 컴퓨터이므로 dfs(2)가 호출되고 네트워크 개수가 추가로 1 증가합니다.
🖍️ 결과적으로 answer는 2가 되고, 두 개의 네트워크가 존재함을 나타냅니다.
참고
'Coding Test' 카테고리의 다른 글
[TIL/03.22] Algorithm: Stack/Queue (0) | 2024.03.22 |
---|---|
[TIL/10.24] Algorithm: DFS/BFS (0) | 2023.10.24 |
[TIL/10.23] Algorithm: DFS/BFS (0) | 2023.10.22 |
[TIL/10.21] Algorithm: 자료구조 기초와 DFS/BFS (0) | 2023.10.22 |
[TIL/10.20] Algorithm: 구현 (0) | 2023.10.19 |