본문 바로가기

삼성 역량테스트 문제

백준 17471 <게리맨더링>

728x90

2가지 선거구로 나누고 선거구가 연결되어있는지 확인하는 문제!

 

부분집합을 구하고 각각의 선거구에서 BFS를 실행해서 연결되어 있는지 확인하는 것!!

 

반대로 생각을 하면 복잡하기도하고... 풀리지 않는 문제 ㅜㅜ 즉 문제를 많이 풀어봐야 한다.

 

 

선거구를 두 개로 나눈 것이다. 

 

이 cal 부분은 선거구가 두 개로 나뉘어서 연결되어 있는지 확인하는 코드이다.

 

두 개가 연결되었다면 count는 2가 될 것이고 값을 비교해서 넣어주게 된다.

 

인접 리스트를 이용해서 다음 노드가 같은 팀인지 확인하게 되고 같은 팀이라면 큐에 넣고 BFS를 실해해 주는 것이다.

 

이렇게 총 3단계를 이용해서 문제를 해결할 수 있다.

이 방법이 생각이 어떻게 나냐? 하는 사람들은 문제를 많이 풀어보길 권한다.

 

전체 코드

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main{

	static int n,result,num[],result1[];
	static boolean visit[],team[];
	static ArrayList<Integer> a[];
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader kb = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(kb.readLine());
		num=new int[n+1];
		a=new ArrayList[n+1];
		team=new boolean[n+1];
		result=Integer.MAX_VALUE;
		for(int i=1;i<=n;i++) {
			a[i]=new ArrayList<Integer>();
		}
		StringTokenizer st = new StringTokenizer(kb.readLine());
		for(int i=1;i<=n;i++) {
			num[i]=Integer.parseInt(st.nextToken());
		}
		for(int i=1;i<=n;i++) {
			st = new StringTokenizer(kb.readLine());
			st.nextToken();
			while(st.hasMoreTokens()) {
				a[i].add(Integer.parseInt(st.nextToken()));
			}
		}
		go(1);
		if(result==Integer.MAX_VALUE) {
			System.out.println(-1);
		}
		else
			System.out.println(result);

	}

	private static void go(int i) {
		// TODO Auto-generated method stub
		if(i==n+1) {
			cal();
			return;
		}
		team[i]=false;
		go(i+1);
		team[i]=true;
		go(i+1);
	}

	private static void cal() {
		// TODO Auto-generated method stub
		 visit=new boolean[n+1];
		 result1=new int[2];
		 int count=0;
		for(int i=1;i<=n;i++) {
			if(!visit[i]) {
				if(count==2) {
					return;
				}
				visit[i]=true;
				bfs(i,count);
				count++;
			}
		}
		if(count==2)
			result=Math.min(result, Math.abs(result1[0]-result1[1]));
	}

	private static void bfs(int i,int who) {
		// TODO Auto-generated method stub
		Queue <Integer>q =new LinkedList<Integer>();
		q.add(i);
		while(!q.isEmpty()) {
			int next=q.remove();
			result1[who]+=num[next];
			for(int j=0;j<a[next].size();j++) {
				int ne=a[next].get(j);
				if(visit[ne]||team[next]!=team[ne])
					continue;
				visit[ne]=true;
				q.add(ne);
			}
		}
	}

}

'삼성 역량테스트 문제' 카테고리의 다른 글

swea 2105 <디저트 카페>  (0) 2020.09.07
백준 17281 <야구공>  (0) 2020.09.06
백준 17779 <게리멘더링2>  (0) 2020.09.02
백준 15686 <치킨 배달>  (0) 2020.08.25
백준 14889 <스타트와 링크>  (0) 2020.08.20