| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- 조합
- 1932
- 정수 삼각형
- 그래프
- 프로그래멋
- DP
- 토마토
- 자바
- 알고리즘고득점Kit
- 백준
- Python
- dfs
- 분할정복
- 깃허브 프로필
- 정렬
- GIT
- Summer/Winter Coding(~2018)
- 다익스트라
- 그래프탐색
- 프로그래머스
- 완전탐색
- 구현
- 15686
- Java
- 알고리즘
- 깃허브
- BFS
- 이코테
- 월간 코드 챌린지 시즌1
- Lv2
- Today
- Total
갱스터하우스
[Java] 프로그래머스 Lv3.네트워크 본문
➡️문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/43162
💡아이디어
BFS, DFS, 그래프탐색!
사실 알고리즘고득점 kit의 깊이/너비 우선 탐색(DFS/BFS)에 있는 문제여서
문제의 유형이 무엇인지는 이미 알고 있었다
그래도 문제에서
"컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고,
컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때
컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다.
따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다."
라는 부분을 읽고,
타고타고가 가능하네?
-> 그럼 1부터 N까지 각 정점을 탐색하면서 하나의 정점에서 방문할 수 있는 노드를 다 방문하자
-> 이때, 1~N 방문하면서 방문하지 않은 노드가 몇 번 나오는지 보자
-> 이게 문제에서 구해야하는 네트워크 수다!
이렇게 아이디어를 생각했다
말만 네트워크지
DFS,BFS 문제를 풀며 많이 봤던 영역 개수 구하기? 유형의 문제와 비슷하다고 생각해서
문제를 읽으며 이거 영역 구하기네!했다
✏️문제 풀이
1. BFS - 성공
1~N까지 각 정점을 방문하면서, 해당 정점을 아직 방문하기 전이라면 BFS를 돌렸다.
지금 코드를 다시 보니,
"자기자신 제외" 는 어차피 visited 배열을 통해 방문 여부를 확인하기때문에 필요가 없는 것 같다.
/*
-> 영역 구하기
1. 1~n까지 bfs 돌려서 연결연결 visited 배열 표시하기
2. 1의 과정거치면서 방문하지 않은 경우-> 네트워크 1증가
*/
import java.util.*;
class Solution {
boolean [] visited;
public int solution(int n, int[][] computers) {
int answer = 0;
visited = new boolean[n];
for(int i = 0; i< n; i++){
if(!visited[i]){
bfs(i, n, computers);
answer++;
}
}
return answer;
}
void bfs(int start, int n, int [][] computers){
visited[start] = true;
Queue<Integer> que = new LinkedList<>();
que.add(start);
while(!que.isEmpty()){
int cur = que.poll();
for(int j = 0; j < n; j++){
if(cur != j){ // 자기자신 제외
if(computers[cur][j] == 1 && !visited[j]){
visited[j] = true;
que.add(j);
}
}
}
}
}
}
2. DFS - 성공
BFS와 똑같고, 대신 재귀를 이용해서 풀었다.
1~N까지 각 정점을 방문하면서, 해당 정점을 아직 방문하기 전이라면 DFS를 돌렸다.
/*
-> 영역 구하기
1. 1~n까지 dfs 돌려서 연결연결 visited 배열 표시하기
2. 1의 과정거치면서 방문하지 않은 경우-> 네트워크 1증가
*/
import java.util.*;
class Solution {
boolean [] visited;
public int solution(int n, int[][] computers) {
int answer = 0;
visited = new boolean[n];
for(int i = 0; i< n; i++){
if(!visited[i]){
dfs(i, n, computers);
answer++;
}
}
return answer;
}
void dfs(int start, int n, int [][] computers){
visited[start] = true;
for(int j = 0; j < n; j++){
if(computers[start][j] == 1 && !visited[j]){
dfs(j, n, computers);
}
}
}
}
+)
개인적으로 프로그래머스는 나에게 벽이 있는(?) 알고리즘 문제라고 생각해
Lv3인데 내가 풀 수 있을까..? 라는 마음에 풀기전부터 약간 쫄았다ㅎㅎ
근데 문제를 읽으니 이거 어디서 많이 본 유형이잖아! 하고
아이디어가 바로 떠올라 빠르게 풀 수 있었다
뭐든 하기 전에 겁 먹는 건 좋지 않은 것 같다!
'코테 문제 > 프로그래머스' 카테고리의 다른 글
| [Java] 프로그래머스 Lv2.타겟넘버 (0) | 2026.04.09 |
|---|---|
| [Java] 프로그래머스 Lv2.비밀 코드 해독 (1) | 2025.08.04 |
| [Java] [Summer/Winter Coding(~2018)] Lv3.기지국 설치 (0) | 2024.11.02 |
| [Java] [월간 코드 챌린지 시즌1] Lv2.쿼드압축 후 개수 세기 (0) | 2024.11.01 |
| [Java] [월간 코드 챌린지 시즌1] Lv2. 삼각 달팽이 (0) | 2024.11.01 |