[Swea - 5643] 키 순서
알고리즘/SW Expert Academy

[Swea - 5643] 키 순서

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXQsLWKd5cDFAUo&

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

1. 유형

그래프

 

2. 풀이

 

인접리스트를 만든다.

 

이때, 주어진 그래프대로 인접리스트를 만들고, 그 반대 방향 인접리스트를 만든다.

 

이런 식으로 주어진 입력값과 반대 방향 리스트를 만든다.

 

4번 노드를 예를 들어보면, 나보다 작은 값은 3개가 있고, 큰 값은 2개가 있다.

 

3+2 =5 즉, 5는 전체 사이즈에서 나를 뺀 값이다. 

 

그러므로 1부터 N번 노드를 돌면서 그래프를 탐색해서 나보다 큰값과 작은 값들의 합이 N-1이 되는 것을 찾으면 된다.

 

보다 쉽게 나보다 작은값과 큰 값을 찾기위해 리스트를 2개를 만든 것이다.

 

3. 코드

package swea;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Swea_5643키순서 {
	static int N,M,sum,sum2;
	static ArrayList<Integer> list[],rev[];
	static boolean visit[];
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine(), " ");
		int T = Integer.valueOf(st.nextToken());
		for (int tc = 1; tc <= T; tc++) {
			N = Integer.valueOf(in.readLine());
			M = Integer.valueOf(in.readLine());
			list = new ArrayList[N+1];
			rev = new ArrayList[N+1];
			for(int i=0;i<=N;i++) {
				list[i]= new ArrayList<>();
				rev[i] = new ArrayList<>();
			}
			for (int i = 0; i < M; i++) {
				st = new StringTokenizer(in.readLine(), " ");
				int a = Integer.valueOf(st.nextToken());
				int b = Integer.valueOf(st.nextToken());
				list[a].add(b);
				rev[b].add(a);
			}
			int ans=0;
			for(int i=1;i<=N;i++) {
				visit = new boolean[N+1];
				sum=0;
				findUp(i);
				visit = new boolean[N+1];
				sum2=0;
				findDown(i);
				if(sum+sum2==N-1) {
					ans++;
				}
			}
			System.out.println("#"+tc+" "+ans);
		}
	}
	static void findUp(int cur) {
		visit[cur] = true;
		for(int next : list[cur]) {
			if(visit[next]) continue;
			sum++;
			findUp(next);
		}
	}
	static void findDown(int cur) {
		visit[cur] = true;
		for(int next : rev[cur]) {
			if(visit[next]) continue;
			sum2++;
			findDown(next);
		}
	}
}
/*
나보다 작은것 큰것 합쳤을때 합이 size-1이 나와야함
입력받을 때, 2번 받기, 위 아래
down up 배열 선언 나중에 더해서 사이즈-1 이면 답이다

반복문 N만큼
현지점에서 나보다 큰 애들 몇명인지
	재귀사용하기
현지점에서 나보다 작은 애들 몇명인지
	재귀사용하기
두개를 더해서 사이즈-1이면 증가
*/

'알고리즘 > SW Expert Academy' 카테고리의 다른 글

[SWEA - 2814] D3 - 최장경로  (0) 2020.12.02
[Swea - 1868] 파핑파핑 지뢰찾기  (0) 2020.11.05
[Swea - 1953] 탈주범 검거  (0) 2020.11.03
[swea - 10888] D4 - 음식배달  (0) 2020.10.19
SWEA level3 - 3282 0/1 knapsack  (0) 2020.09.22