요르딩딩

네트워크 (level 3) 본문

[코딩테스트]/문제풀이

네트워크 (level 3)

요르딩딩 2022. 9. 23. 13:25
728x90
반응형

이번문제는 dfs/bfs로 풀 수 있는 문제입니다.

 

처음에는 이차원 배열을 활용한 dfs로 구현하였으나, 단방향/양방향에 이슈로 인해 정답이 제대로 나오지 않았습니다.

 

처음에 구현한 방식은 이차원 배열의 값들을 하나씩 체크하여, 지나갈 수 있고 방문가능한 갯수를 세었습니다.

 

[1, 0, 0, 1]

[0, 1, 1, 0]

[0, 1, 1, 0]

[1, 1, 0, 1]]

이렇게 하다보니 위와 같은 케이스에서 단방향/양방향 이슈에 직면하였습니다. (2->4 = 0)

 

물론 이것을 양방향으로 만들어도 원하는 결과를 도출해 낼 수 없었습니다. 

그 이유는 원하는 정답을 도출해 내는 방식이 틀렸기 때문이라고 생각합니다. 

 

그리하여, 리스트를 활용한 dfs를 활용했습니다. 

 

네트워크와 같이 하나의 흐름을 쭉 확인해야하는 문제는, 이차원 배열을 이용한 체크말고,

연결리스트나 visited를 일차원 배열로 갖는 방식을 사용해야합니다. 이 부분이 가장 핵심이라고 생각합니다.

import java.util*;

class Solution {

	public boolean[] visited;

	public int solution(int n, int[][] computers) {
		int answer = 0;

		visited = new boolean[n]; // 초기화

		List<List<Integer>> list = new ArrayList<>();
		for (int i = 0; i < n; i++) {
			list.add(new ArrayList<>());
		}

		// 연결리스트 세팅
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (computers[i][j] == 1 && i != j) {
					list.get(i).add(j);
				}
			}
		}

		for (int i = 0; i < n; i++) {
			if (visited[i] == false) { // 방문안한 노드만 실행
				dfs(i, list);
				answer++;
			}
		}

		return answer;
	}

	public void dfs(int x, List<List<Integer>> list) {
		visited[x] = true;

		List<Integer> alist = list.get(x); //연결된 다음 노드로 이동
		for (Integer a : alist) {
			if (visited[a] == false) {
				dfs(a, list);
			}
		}
	}
}
728x90
반응형

'[코딩테스트] > 문제풀이' 카테고리의 다른 글

최솟값만들기:정렬 (Level2)  (0) 2022.09.27
단어 변환 : BFS (Level3)  (1) 2022.09.23
이중우선순위 큐 (level 3)  (0) 2022.09.19
정수삼각형 (Level 3)  (0) 2022.09.15
최고의 집합 (Level 3)  (0) 2022.09.13
Comments