문제
- 오늘은 새 학기 새로운 반에서 처음 시작하는 날이다. 현수네 반 학생은 N명이다. 현수는 각 학생들의 친구관계를 알고 싶다.
- 모든 학생은 1부터 N까지 번호가 부여되어 있고, 현수에게는 각각 두 명의 학생은 친구 관계가 번호로 표현된 숫자쌍이 주어진다.
- 만약 (1, 2), (2, 3), (3, 4)의 숫자쌍이 주어지면 1번 학생과 2번 학생이 친구이고, 2번 학생과 3번 학생이 친구, 3번 학생과 4번 학생이 친구이다.
- 그리고 1번 학생과 4번 학생은 2번과 3번을 통해서 친구관계가 된다.
- 학생의 친구관계를 나타내는 숫자쌍이 주어지면 특정 두 명이 친구인지를 판별하는 프로그램을 작성하세요.
- 두 학생이 친구이면 “YES"이고, 아니면 ”NO"를 출력한다.
입력
- 첫 번째 줄에 반 학생수인 자연수 N(1<=N<=1,000)과 숫자쌍의 개수인 M(1<=M<=3,000)이 주어지고,
- 다음 M개의 줄에 걸쳐 숫자쌍이 주어진다.
- 마지막 줄에는 두 학생이 친구인지 확인하는 숫자쌍이 주어진다.
출력
- 첫 번째 줄에 최대로 벌 수 있는 수입을 출력한다.
입출력 예제
풀이방식
이번 문제는 그리디 알고리즘에 대한 문제이다.
그리디 알고리즘이란 현재 상황에서 지금 당장 좋은 것만 고르는 방법을 의미한다.
설계과정
1. v 번째 학생의 집합번호를 리턴해주는 Find 메소드를 작성한다.
2. Find 메소드를 통해 얻은 정보로 집합 번호와 학생 번호를 비교하는 Union 메소드를 작성한다.
3. Find, Union 메소드를 계속 수행해서 결과를 출력한다.
풀이과정
1. 각 변수들을 선언한다.
- 서로소 집합을 가진 unf[ ] 을 선언한다.
- 앞의 학생의 집합번호를 담을 fa 을 선언한다.
- 뒤의 학생의 집합번호를 담을 fb 을 선언한다.
- 학생 수를 의미하는 변수 N 을 선언한다.
- 순서쌍의 개수를 의미하는 변수 M 을 선언한다.
- 즉, 7개의 순서쌍을 통해 unf 배열을 완성하고, 마지막에 입력된 값으로 두 학생이 친구 사이인지 확인한다.
2. v 번째 학생의 집합 번호를 리턴하는 Find 메소드를 작성한다.
3. v번째 학생과 해당 학생의 집합 번호가 동일하면 v 를 그대로 리턴한다.
4. 다르다면 Find(unf[v]) 를 unf에 넣는다.
- 해당 일자에 해당하는 강의만 확인하고, 그 중 큰 값을 비교하기 위해서이다.
5. 같은 집합 번호인지 확인하는 Union 메소드를 작성한다.
6. fa와 fb가 다르다면 unf[fa]에 fb 값을 넣는다.
7. Find와 Union 메소드를 수행하면 아래와 같다.
- (1, 2)를 예시로 들어보자.
- 처음 unf 배열은 다음과 같다.
- Find 메소드를 수행한다.
- 1을 보면 v와 unf[v]가 1로 값이 같기에 1을 리턴하고, 2도 마찬가지이다.
- 다음으로 Union 메소드를 수행한다.
- fa는 1, fb는 2이기에 unf[fa] 를 fb 즉, 인덱스 1번과 2번의 값이 전부 2로 만든다.
8. 위 과정을 반복해서 unf 배열을 완성한 후, 결과를 위한 두 학생의 집합번호를 확인한다.
해당 글은 인프런 > 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비(김태원)강의를 참고하여 작성하였습니다.
'알고리즘 > 인프런' 카테고리의 다른 글
섹션 10. dynamic programming(동적계획법) 1. 계단오르기 (2) | 2023.01.18 |
---|---|
섹션 9. Greedy Algorithm 7. 원더랜드(최소스패닝트리) (2) | 2023.01.16 |
섹션 9. Greedy Algorithm 4. 최대수입스케쥴( PriorityQueue) (0) | 2023.01.13 |
섹션 9. Greedy Algorithm 3. 결혼식 (0) | 2023.01.10 |
섹션 9. Greedy Algorithm 2. 회의실 배정 (0) | 2023.01.09 |