일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백내장 다초점렌즈 삽입술
- 코드스테이츠 부트캠프
- Java
- Gamsgo
- 백내장 금감원
- 코드스테이츠 합격
- 에이치엘비
- 보험금 지급거절
- 코드스테이츠 백엔드 부트캠프 합격
- Spring
- 코드스테이츠 백엔드 후기
- 해시
- 금융감독원 민원신청
- 금감원
- 코테 합격후기
- 백준 알고리즘
- 코드스테이츠 부트캠프 합격 후기
- 코드 스테이츠 백엔드 교육과정
- 겜스고
- HLB
- 코드스테이츠 합격 후기
- Code States 백엔드 합격 후기
- codestates 국비지원 1기 합격 후기
- 금융감독원
- 코드스테이츠 백엔드 교육과정
- 금감원 백내장 민원
- 메서드
- 백내장
- 자바
- CodeState 후기
Archives
- Today
- Total
개발하는 동그리
백준 알고리즘 [유니온파인드] 친구네트워크_4195_골드2 본문
반응형
문제
친구네트워크
체감 난이도
골드1
문제 풀이 소감
매번 테스트 케이스마다 네트워크 활성화 된 친구를 어떻게 계산할지 (key)
- 각 노드별로 크기를 key를 이용해 저장해놓고 union 합산할 때 key도 더해줌
숫자가 아닌 문자열을 어떻게 배열로 관리할 지 (key)
- hashMap을 통해 문자열마다 value (-parent key) 값을 할당해서 필요할 때 꺼내씀
코드
public class Main {
static int[] parents;
static int[] sizes; // 각 집합의 크기
static HashMap<String, Integer> nameMap;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder(); // 출력 관리용
for (int t = 0; t < T; t++) {
int F = Integer.parseInt(br.readLine());
parents = new int[F * 2 + 1];
sizes = new int[F * 2 + 1];
nameMap = new HashMap<>();
// 초기화
for (int i = 0; i <= F * 2; i++) {
parents[i] = i; // 자기 자신이 부모
sizes[i] = 1; // 초기 크기는 1
}
for (int i = 0; i < F; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String name1 = st.nextToken();
String name2 = st.nextToken();
int num1 = getNumber(name1);
int num2 = getNumber(name2);
// Union 연산으로 연결
sb.append(Union(num1, num2)).append("\n");
}
}
System.out.print(sb); // 결과를 한 번에 출력
}
private static int getNumber(String name) {
if (!nameMap.containsKey(name)) {
nameMap.put(name, nameMap.size() + 1);
}
return nameMap.get(name);
}
private static int Union(int x, int y) {
x = Find(x);
y = Find(y);
if (x != y) {
if (sizes[x] < sizes[y]) {
parents[x] = y;
sizes[y] += sizes[x];
return sizes[y];
} else {
parents[y] = x;
sizes[x] += sizes[y];
return sizes[x];
}
}
return sizes[x]; // 이미 같은 집합이라면 크기 반환
}
private static int Find(int x) {
if (x == parents[x]) return x;
return parents[x] = Find(parents[x]);
}
}
문제 바로가기
https://www.acmicpc.net/problem/4195
반응형