광규니
광규니네
광규니
전체 방문자
오늘
어제
  • 분류 전체보기 (154)
    • 알고리즘 (100)
      • 알고리즘 개념 (2)
      • 문제 풀이 (96)
    • 주절주절 (19)
      • 자격증, 활동 후기 (4)
      • 전시회 후기 (3)
      • 이모저모 (2)
      • 회고 (3)
      • 뜨럼 (7)
    • 운영체제 (9)
    • 개발 지식 (9)
      • Apple Watch (4)
      • MySQL (2)
      • Eclipse (1)
      • XCode (1)
    • 네트워크 공부 (1)
    • 데이터베이스 공부 (5)
    • Java 공부 (7)
    • TMP (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 애플워치 앱
  • DP
  • 알고리즘
  • 구현
  • 컴퓨터 사이언스
  • OS
  • 티스토리챌린지
  • 파이썬
  • 합주
  • 백준
  • 개념
  • BOJ
  • 운영체제
  • 오블완
  • 프로그래머스
  • 다이나믹 프로그래밍
  • BFS
  • 드린이
  • 자바
  • 애플워치 앱 만들기

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
광규니
알고리즘/문제 풀이

[Java/자바 백준 1976] 여행가자

알고리즘/문제 풀이

[Java/자바 백준 1976] 여행가자

2022. 3. 9. 14:12
반응형

풀이

유니온 파인드 문제 

 

문제 핵심은 연결되었는지에 대해 물어보는 문제

매개체 도시가 있어서 1 - 3 도시가 서로 연결 되어있지 않아도

1 - 2 - 3 이 연결 되었으면 연결된 것 !

 

parents 배열을 만들어주고 먼저 자기 자신을 부모로 갖게 설정한 뒤,

입력을 받으면서 1인 경우(연결된 경우)에 한해서 유니온 파인드를 적용해주었습니다.

 

연결된 경우 이므로 a, b 둘중 인덱스가 큰 숫자를 작은 인덱스에 자식으로 갖게 만들어주었습니다.

 

ex) union (0, 4) 일경우

왼쪽이 적용 전, 오른쪽이 적용 후

이 상태에서 union (2,4)가 들어온다면 

aRoot = 2 이지만

bRoot는 4 -> 0 이므로 bRoot = 0이 됩니다.

그렇다면 parents 배열은 이런식으로 바뀌겠죠 !

 

유니온 파인드를 모두 적용 시킨 후,

정해진 여행 계획에서 다른 parents값을 가진 다면 NO

같다면 YES로 출력 !

import java.io.*;
import java.util.*;

public class Main {
	static int N, M;
	static int[] parents;
	static int[] root;
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		N = Integer.parseInt(br.readLine());
		M = Integer.parseInt(br.readLine());
		
		make();
		
		root = new int[M];
		for(int i = 0 ; i < N ; i++) {
			st = new StringTokenizer(br.readLine());
			for(int j = 0 ; j < N ; j++) {
				int temp = Integer.parseInt(st.nextToken());
				if(temp == 1) union(i, j);
			}
		}
		
		st = new StringTokenizer(br.readLine());
		for(int i = 0 ; i < M ; i++) {
			root[i] = Integer.parseInt(st.nextToken()) - 1;
		}
		
		boolean flag = true;
		
		for(int i = 1 ; i < M ; i++) {
			if(parents[root[i]] != parents[root[i-1]]) flag = false;
		}
		
		if(flag) System.out.println("YES");
		else System.out.println("NO");
	}
	
	private static void union(int a, int b) {
		int aRoot = find(a);
		int bRoot = find(b);
		
		if(aRoot < bRoot) parents[bRoot] = aRoot;
		else if(aRoot > bRoot) parents[aRoot] = bRoot;
	}
	
	private static int find(int a) {
		if(a == parents[a]) return a;
		return parents[a] = find(parents[a]);
	}
	
	private static void make() {
		parents = new int[N];
		for(int i = 0; i < N ; i++) {
			parents[i] = i;
		}
	}

}
반응형
저작자표시 (새창열림)

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[Java/자바 백준 16928] 뱀과 사다리 게임  (0) 2022.03.27
[Java/자바 백준 16954] 움직이는 미로 탈출  (0) 2022.03.11
[Java/자바 백준 17406] 배열돌리기 4  (0) 2022.03.08
[Java 백준 16637] 괄호 추가하기  (0) 2022.03.07
[Java/자바 백준 17281] 공  (0) 2022.02.28
  • 풀이
'알고리즘/문제 풀이' 카테고리의 다른 글
  • [Java/자바 백준 16928] 뱀과 사다리 게임
  • [Java/자바 백준 16954] 움직이는 미로 탈출
  • [Java/자바 백준 17406] 배열돌리기 4
  • [Java 백준 16637] 괄호 추가하기
광규니
광규니
공부 및 일상 올리기~

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.