// 알고리즘 1. 시뮬레이션 2. 큐를 이용한 문제 -> 인덱스와 중요도를 하나의 클래스로 정의하여 큐에 집어넣음 -> 하나씩 poll 하고 남아있는 문서의 중요도를 확인 후 처리 -> 중요도를 담는배열 arr와 해당 문서를 처리하면 -1로 설정 더보기 import java.util.*; import java.io.*; public class 프린터큐_1966 { static int T, N, M, arr[], ans; static class Point { int idx, pr; public Point(int idx, int pr) { this.idx = idx; this.pr = pr; } } public static void main(String[] args) throws Exception { Bu..
// 알고리즘 1. bfs 2. 3개의 벽을 세움 -> v[N][M][N][M][N][M] 방문배열을 사용하여 중복계산제거 3. 벽을 세운 후 바이러스 퍼뜨리기 -> 기존의 map을 입력할 때 바이러스 위치를 dq에 저장해놓고 bfs 시작 시 dq에 있는 모든값을 q에 집어넣고 시작 -> 4방 탐색 -> 바이러스가 증식한 개수를 카운팅 4. 결과 -> 기존의 맵을 입력받을 때 0의 개수 카운팅 -> 0의 개수 - 증식한 개수 - 3(벽) -> 최대값 더보기 import java.util.*; import java.io.*; public class 연구소_14502 { static int N, M, ans,cnt_zero; static boolean v[][][][][][]; static Queue dq;..
// 알고리즘 1. 백트래킹 2. 2차원 방문배열 사용 -> (1+2, 1+3, 1+4, 1+5, 1+6, 1+7, 1+8, 1+9, 2+3, 2+4, 2+5, ...) 과 같이 사용할 수 있는 블록이 (x,y)형태로 주어지기 때문에 2차원 배열 사용 -> 기존 스도쿠처럼 하나씩 값을 변경하는 문제가 아닌 2칸의 블록 형태로 집어 넣는 문제 임. 3. 오른쪽 / 아래를 탐색하는 배열 -> 왼쪽 위부터 하나 씩 채워지기 때문에 오른쪽과 아래만 탐색하면 됨. 더보기 import java.util.*; import java.io.*; public class 스도미노쿠_4574 { static int N; static boolean flag; static boolean[][] v; static int[] dr ..
//알고리즘 1. bfs 2. 3차원 방문배열 사용 -> 벽을 부시고 갈 때, 안 부시고 갈때 방문배열을 가지고 가야 함 더보기 import java.util.*; import java.io.*; public class 벽부수고이동하기2_14442 { static int N, M, K, map[][]; static boolean v[][][]; static int[] dr = { -1, 0, 1, 0 }; static int[] dc = { 0, 1, 0, -1 }; static class Point { int r, c, k, cnt; public Point(int r, int c, int k, int cnt) { super(); this.r = r; this.c = c; this.k = k; this...
//알고리즘 1. bfs 2. 방문배열을 4차원 배열로 가져가야하는 문제 -> 빨간공과 파란공이 같이 움직이므로 각각의 좌표에 해당하는 방문배열을 만들어야 함. 3. 이동 -> 보통 빨간색을 먼저 이동시킴 -> 빨간색의 1칸 이동범위에 파란색이 있을 경우 파란색부터 움직여야 함. (엣지 케이스일듯?) 4. 결과 -> 공이 들어갔을 경우를 확인하기위해 boolean R, B 사용 -> boolean b,r 은 벽면에 닿았을 때를 의미함. (더이상 갈 수 없을 경우) 더보기 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.ut..
// 알고리즘 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..