// 알고리즘 1. 시뮬레이션 -> 주어진 조건대로 0,1 인덱스 비교 1,2 인덱스 비교 ~ 3,4 비교 -> 1부터 5까지 순서대로 정렬되어있는지 확인 더보기 import java.util.*; import java.io.*; public class 나무조각_2947 { static int arr[]; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); arr = new int[5]; for (int i = 0..
// 알고리즘 1. 최소 스패닝 트리 2. 주어진 배열을 이용하여 인접리스트를 만듦 3. 크루스칼 알고리즘으로 최소값을 구함. 더보기 package baekjoon; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.StringTokenizer; public class 행성연결_16398_kruskal { static int N, parents[]; static class Point implements Comparable { int s, e, c; publi..
// 알고리즘 1. 최소 스패닝 트리 2. 주어진 인접리스트를 이용하여 Prim알고리즘으로 해결 3. 결과값이 int범위를 초과하는 경우가 생길 수 있음. 더보기 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.PriorityQueue; import java.util.StringTokenizer; public class 행성연결_16398_prim { static int N, map[][]; static class Point implements Comparable { int to; long cost; public ..
//알고리즘 1. dp 2. 이분탐색을 이용하여 dp테이블을 구현 더보기 import java.io.*; import java.util.*; public class 가장긴증가하는부분수열2_12015 { static int N, arr[], LIS[]; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); N = Integer.parseInt(br.readLine()); arr = new int[N]; LIS = new int[N]; StringTokenizer st = new StringTokenizer(br.readLi..
// 알고리즘 1. dp 2. 현재 인덱스를 기준으로 이전 인덱스들을 탐색 -> 만약 이전값이 현재 값보다 크다면 패스 -> 이전값이 현재 값보다 작다면 dp 테이블을 비교하여 이전값의 dp테이블 +1 3. 생성된 dp 테이블에서 가장 큰 값이 가장 긴 증가하는 부분수열임. 더보기 import java.io.*; import java.util.*; public class 가장긴증가하는부분수열_11053 { static int N, arr[], dp[]; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); N = Inte..
// 알고리즘 1. 구현 2. 탐색 배열 사용 -> 원래 8방 탐색을 해야하지만 왼쪽 위부터 검사한다면 4방 탐색으로도 가능 -> 우상, 우, 우하, 하 더보기 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class 오목_2615_re { static int[] dr = { -1, 0, 1, 1 }; static int[] dc = { 1, 1, 1, 0 }; static int[][] map; public static void main(String[] args) throws IOException { Buffer..
//알고리즘 1. 그래프 탐색 2. 주어진 간선으로 인접리스트를 생성 3. 방문배열 ->방문배열을 int배열로 만들어 1부터 시작하여 도달할 수 있는 거리를 저장한다. -> 이미 방문한 노드는 0이 아님 -> 시작점은 -1로 세팅해야 함 4. 방문배열의 최대값을 찾고 정답을(가장 먼 노드들)찾음 더보기 import java.util.*; class Solution { ArrayList[] list; int[] v; class Point{ int r,cnt; public Point(int r,int cnt){ this.r = r; this.cnt = cnt; } } public int solution(int n, int[][] edge) { int answer = 0; list = new ArrayList..
//알고리즘 1. 완전탐색 2. brown과 yellow의 합을 만들 수 있는 곱셈의 조합을 다 계산해봐야 함. -> yellow가 1이상 있어야 하니까 i = 3이상이 되어야 함. 3. for문을 3부터 돌려서 모든경우를 체크 더보기 import java.util.*; class Solution { public int[] solution(int brown, int yellow) { int[] answer = new int[2]; int sum = brown + yellow; int y = 0, x = 0; for(int i = 3; i
// 알고리즘 1. 순열 + 조합문제 2. 주어진 문자열을 각가 나눔 -> char 배열을 사용하여 각각 나눔 3. 1개 뽑는 경우 부터 다 뽑는 경우까지 조합을 만듦 4. 만들어 조합을 HashSet에 저장 -> ex) 011과 11이 같은 수 이므로 set을 사용하여 중복데이터를 없애줌. 5. 만들어진 set을 가지고 소수를 판별하면 됨 -> 2부터 시작하여 소수인지 판별 더보기 import java.util.*; class Solution { static int ans; static char[] num; static boolean[] v; static HashSet set; public int solution(String numbers) { num = numbers.toCharArray(); v =..
//알고리즘 1. 탐색 -> 최소시간을 출력하므로 bfs탐색 2. 활성화 시킬 바이러스 선택 -> 바이러스를 ArrayList로 받고 선택할 바이러스를 조합으로 구현 3. 선택된 바이러스를 큐에넣고 bfs탐색 시작 -> 최소시간이기 때문에 우선순위큐 사용 -> 활성 바이러스가 비활성 바이러스가 있는 칸으로 가면 비활성 바이러스가 활성으로 변한다라는 조건이 있어서 탐색 중 비활성화된 바이러스에 도달한다면 현재의 시간+1 값으로 세팅해 큐에 다시 넣음 -> bfs가 끝나면 바이러스가 안 퍼진 곳이 있는 지 확인 후 정답 출력 더보기 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import..