📖 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💡 풀이 방식
• 구현 (배열)
총 2가지의 배열 (진입/진출 간선 수 저장용 배열)을 생성한다.
각 그래프 모양마다 진입 간선 수와 진출 간선 수에서 어떤 특징을 갖는지에 따라 갯수를 구한다.
- 생성점 → 진입 간선 X / 진출 간선 수 >= 2 인 정점
- 막대 그래프 → 진입 간선 수 = 1 / 진출 간선 X 인 정점
- 8자 그래프 → 진입 간선 수 >= 2 / 진출 간선 수 >= 2 인 정점
- 도넛 → 막대와 8자 그래프를 제외한 나머지
💥 유의사항
🔺 코드
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
32
33
34
35
36
37
38
39
40
41
42
43
|
import java.util.*;
class Solution {
static final int MAX = 1_000_000;
static int[][] edges;
static int[] input, output;
public int[] solution(int[][] edges) {
this.edges = edges;
input = new int[MAX + 1]; // 받은 것 (진입)
output = new int[MAX + 1]; // 준 것 (진출)
int maxNode = 0;
for(int[] e : edges) {
input[e[1]]++;
output[e[0]]++;
maxNode = Math.max(maxNode, Math.max(e[0], e[1]));
}
int[] answer = new int[4];
for(int i = 1 ; i <= maxNode ; i++) {
if(input[i] == 0 && output[i] >= 2) { // [정점] 진입 간선이 없고, 진출 간선이 2개 이상인 경우
answer[0] = i;
}
else if(input[i] > 0 && output[i] == 0) { // [막대 모양] 진입 간선이 1개 이상, 최상위 노드에서 다른 노드로 진출하는 간선이 없는 경우
answer[2]++;
}
else if(input[i] >= 2 && output[i] >= 2) { // [8자 모양] 진입 간선이 2개 이상, 진출 간선이 2개 이상인 경우
answer[3]++;
}
}
// [도넛 모양] 생성된 정점으로부터 진출한 간선 수 - (막대 모양 그래프 수 + 8자 모양 그래프 수)
answer[1] = output[answer[0]] - (answer[2] + answer[3]);
return answer;
}
}
|
cs |
➕ 다른 풀이 방식
1) Map을 활용한 풀이
[Programmerse] Level2 도넛과 막대 그래프
문제 요약 알고리즘 분류: 그래프 난이도: Level2 문제 요약 도넛 모양 그래프, 막대 모양 그래프, 8자 모양 그래프들이 있다. 이 그래프들은 1개 이상의 정점과, 정점들을 연결하는 단방향 간선으
jih3508.tistory.com
2) 사이클의 갯수를 구해 모양을 판별하는 풀이다. (BFS)
사이클이 0개면 막대, 사이클이 2개면 8자, 그 외의 경우면 도넛 모양으로 처리한다.
(내가 처음에 풀려고 생각했던 방식!!!)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
import java.util.*;
class Solution {
static final int L = 1000000;
List<Integer>[] adjList = new ArrayList[L + 1];
int[] outDegree = new int[L + 1];
int[] inDegree = new int[L + 1];
boolean[] isVisited = new boolean[L + 1];
public int[] solution(int[][] edges) {
for (int i = 0 ; i <= L ; i++) {
adjList[i] = new ArrayList<>();
}
for (int[] edge : edges) {
int from = edge[0];
int to = edge[1];
adjList[from].add(to);
inDegree[to]++;
outDegree[from]++;
}
int start = 0;
for (int i = 1; i <= L; i++) {
if (outDegree[i] >= 2 && inDegree[i] == 0) {
start = i;
break;
}
}
int[] answer = new int[]{start, 0, 0, 0};
for (int now : adjList[start]) {
int cycleCount = findCycleCount(now);
if (cycleCount == 0) { // 막대
answer[2]++;
} else if (cycleCount == 2) { // 8자
answer[3]++;
} else { // 나머지
answer[1]++;
}
}
return answer;
}
// ⭐ 사이클 갯수 찾는 메서드 (BFS)
private int findCycleCount(int s) {
Deque<Integer> q = new ArrayDeque<>();
q.add(s);
isVisited[s] = true;
int cycleCount = 0;
while(!q.isEmpty()) {
int now = q.poll();
for (int next : adjList[now]) {
if (isVisited[next]) {
cycleCount++;
continue;
}
q.add(next);
isVisited[next] = true;
}
}
return cycleCount;
}
}
|
cs |
💦 어려웠던 점
- 35번째 TC만 틀린다면 아래 내용을 확인하면 좋을 것 같다. (나의 경우 29번째 줄 else if문에서 input[i] > 0
이라는 조건을 빠뜨려 틀리고 있었다.)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🧐 새로 알게 된 내용
- 그림 보고 특징을 잘 파악하자,,,,
- 사이클 갯수 확인하는 방법도 기억해두자... (BFS)
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
[프로그래머스] 도넛과 막대 그래프
여러개의 정점이 있고, 간선의 정보가 주어진다. \[a, b]는 a->b로 이어져있다는 뜻이다.간선을 모두 이었을 때 도넛, 막대, 8자 3종류의 그래프와 생성 정점이 생긴다.이 때 생성 정점과 각 종류 그
velog.io
[Programmers] 도넛과 막대 그래프
문제 링크입니다: https://school.programmers.co.kr/learn/courses/30/lessons/258711 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와
jaimemin.tistory.com
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
'코테 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Level2] 리코쳇 로봇 (JAVA) (0) | 2024.03.28 |
---|---|
[프로그래머스/Level3] 기지국 설치 (JAVA) (0) | 2024.03.28 |
[프로그래머스/Level2] 배달 (JAVA) (0) | 2024.03.24 |
[프로그래머스/Level2] 혼자 놀기의 달인 (JAVA) (0) | 2024.03.19 |
[프로그래머스/Level2] 광물 캐기 (JAVA) (0) | 2024.03.19 |