본문 바로가기

알고리즘

(3)
[BOJ 2637] 장난감조립 위상정렬을 이용한 매커니즘1.Outdegree = 0 인 노드는 기본부품.2.Indegree가 0인 노드를 선택.3.다음 노드의 부품 개수 += 현재 노드의 부품 개수 * 다음 노드가 필요한 개수(k)4.Indegree[다음 노드] -=1 785 1 25 2 27 5 26 5 26 3 36 4 47 6 37 4 5입력이 다음과 같을 때, 위상정렬을 다음과 같이 그릴 수 있다. inDegree가 0인 노드부터 꺼내서 연결된 노드를 제거한 뒤, 그 연결된 노드를 필요로 하는 개수를 지금 inDegree가 0인 노드를 필요로 하는 개수 * 지금 inDegree가 연결된 노드를 필요로 하는 개수를 더해준다. import sysfrom collections import dequeinput = sys.stdin.r..
[BOJ 16234] 인구이동 매커니즘1. 국경선이 개방된 나라들끼리 연합 번호를 붙여준다.2. 연합에 속해있는 국가의 수, 총 인원수를 센다.3. 인원 이동을 시킨다. (평균 값으로 바꿔주기) 1. 연합 번호 붙이기각 나라들의 연합 번호가 들어갈 guild(n*m)배열을 만든다. bfs를 이용하여 두 나라 간의 인구 차이가 l과 r사이라면 그 나라의 위치에 guildNum을 붙여준다.위 예시처럼 한다면 guild 배열은[   [1, 1, 2],   [1, 1, 2],   [3, 2, 2]]와 같은 배열이 된다. 2. 각 연합에 속해 있는 국가의 수와 총 인원 수 세기연합 번호를 붙일 때, 국가의 수와 총 인원수를 함께 계산해서 guildDict라는 dictionary에 {연합번호 : [연합국의 수, 총 인원]}을 삽입해준다.위 예시..
비트마스킹을 이용한 모든 부분집합 구하기 public class Subset { public static void main(String[] args){ char[] arr = {'A', 'B', 'C', 'D'}; int len = arr.length; for (int i = 1; i  비트마스킹을 이용한 모든 부분집합을 구하는 원리는 집합에서 꺼내올 원소를 1로 보는 것이다. char[] arr = {'A', 'B', 'C', 'D'} 라는 집합을 보자. 이 집합의 부분집합으로는 {'A','B','AB','C','AC','BC','ABC','D','AD','BD','ABD','CD','ACD','BCD','ABCD'}가 있다. 이 부분집합들은 각각 {1000(2), 0100(2), 1100(2), 0..