[swea] 5643번 키순서 (java, dfs)
728x90
반응형
처음에 플로이드 와샬로 풀었는데 t의 자리에 tc를 넣었다가 런타임에러 났었다. 내일 다시 플로이드 와샬로 풀어봐야지
내 위치에서 dfs로 돌면서 next(나보다 큰 친구들)의 count값을 증가시키면 next입장에서는 작은 애들의 개수만큼
업데이트가 된다. temp는 dfs를 도는 횟수를 가르키는데 현재 내 번호보다 큰 친구들의 수(나 포함)로 count[내번호]+temp 해주면 나보다 큰 친구들의 수를 구할 수 있다.
이렇게 temp로 업데이트 (나 포함해서 나보다 큰 친구들의 수) + count[next] 업데이트 (나보다 작은 친구수만큼 증가)
의 합이 n이 되면 나의 순서를 알 수 있는 경우이다.
import java.util.ArrayList;
import java.util.Scanner;
public class Solution {
static int t,n,m;
static ArrayList<Integer>[] big;
static int[] count;
static boolean[] vis;
static int temp;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
t=sc.nextInt();
for (int tc = 1; tc <=t; tc++) {
n=sc.nextInt();
m=sc.nextInt();
big=new ArrayList[n+1];
count=new int[n+1];
for (int i = 1; i <n+1; i++) {
big[i]=new ArrayList<>();
}
for (int i = 0; i < m; i++) {
int a=sc.nextInt();
int b=sc.nextInt();
big[a].add(b);
}
for (int i = 1; i <=n; i++) {
temp=0;
vis=new boolean[n+1];
dfs(i,i);
count[i]+=temp;//나보다 큰 애들
}
int total=0;
for (int i = 1; i <=n; i++) {
// System.out.print(count[i]+" ");
if(count[i]==n)total+=1;
}
System.out.printf("#%d %d\n",tc,total);
}
}
private static void dfs(int cur,int start) {
temp+=1;
for (int i = 0; i < big[cur].size(); i++) {
int next=big[cur].get(i);
if(vis[next])continue;
vis[next]=true;
count[next]+=1;//next보다 작은 친구들이 업데이트 해준다
dfs(next,start);
}
}
}
728x90
반응형
'swexpert' 카테고리의 다른 글
[swexpert] 1868. 파핑파핑 지뢰찾기 (java) (0) | 2021.04.23 |
---|---|
[swexpert] 2115. 벌꿀 채취 (java, 백트래킹, 완전탐색) (0) | 2021.04.22 |
[SWEA] 5604. 구간합 (java, 수학) (0) | 2021.04.21 |
[swexpert] 2112. 보호 필름 (dfs, 완탐, java) (0) | 2021.04.20 |
[swexpert] 5607. 조합 (페르마의 정리, 재귀, java) (0) | 2021.04.19 |
TAGS.