Algorithm/baekjoon 126

이분 그래프

📍 문제 설명 💡 접근 둘로 분할해야 하므로 전체 영역에 대해서 탐색해야 한다. 각 정점에서 인접한 영역 끼리는 다른 집합이라고 간주한다. 인접한 영역끼리 같은 집합에 속해있으면 이분 그래프가 아닌거다. 👩‍💻 코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.*; public class Main { static int n, m, v, e, k; static String answer; static int[][] board; static int[] arr; static long[] dp; static int[] visited; static int[] dx = {-1,1,0,0}; static int[] d..

Algorithm/baekjoon 2022.02.18

연결 요소의 개수

📍 문제 설명 💡 접근 연결 요소가 무슨 뜻인지 몰라서 개념을 찾아봤다. 돌 수 있는 만큼 최대한 돌고 카운팅 시켜주면된다. 👩‍💻 코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.*; public class Main { static int n, m, v, answer; static int[][] board; static int[] arr; static long[] dp; static boolean[] visited; static int[] dx = {-1,1,0,0}; static int[] dy = {0,0,-1,1}; static ArrayList list = new ArrayList(); sta..

Algorithm/baekjoon 2022.02.18

DFS와 BFS

📍 문제 설명 💡 접근 기초 DFS/BFS 문제 1.DFS 방문할 수 있는 지점이 여러 개여도 하나만 출력하면 되므로 출력 배열을 따로 만들어 사용안해도 된다. 2.BFS 방문 체크만해서 큐에 넣고 빼면된다. 작은 정점부터 방문해야 하므로 정렬 처리가 필요하다. 👩‍💻 코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.*; public class Main { static int n, m, v, answer; static int[][] board; static int[] arr; static long[] dp; static boolean[] visited; static int[] dx = {-1,1,0,0..

Algorithm/baekjoon 2022.02.18

ABCDE

📍 문제 설명 💡 접근 A는 B와 친구다. B는 C와 친구다. C는 D와 친구다. D는 E와 친구다. 라는 조건을 확인해보면 총 인원이 얼마든 5명의 사람이 각각 순서대로 친구 관계라면 정답인 문제다. 따라서 모든 지점에 대해서 각각 탐색을 해야 한다. 1.탐색 지점을 방문 처리하고 갈 수 있는 정점 중에서 방문하지 않은 정점을 갈 수 있는 만큼 가본다. 2.친구관계를 올바르게 찾지 못했을 경우(갈 수 있는 경로가 더 이상 없는 경우) 타 지점으로도 찾아볼 수 있도록 갔던 곳의 방문 체크를 풀어준다. 3.친구관계 찾았으면 더 볼 필요 없이 바로 끝내버린다. 👩‍💻 코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java..

Algorithm/baekjoon 2022.02.17

연속합 2

📍 문제 설명 💡 접근 수를 제거하지 않는 최대합과 수를 한 번 제거하는 최대합을 표현하는 2차월 배열을 이용한다. 1. 수를 제거하지 않는 경우 이 경우에는 기존 연속합 문제와 동일하다. 2. 수를 제거하는 경우 이 경우에는 수를 제거 한 적이 있는지/없는지 판단하여 최댓값을 구한다. 수를 제거 한 적이 있으면 현재 인덱스의 숫자를 지우지 못하므로 dp[i-1][1] + arr[i] 수를 제거 한 적이 없으면 현재 인덱스의 숫자를 지울 수 있으므로 dp[i-1][0] 이 중의 최댓값이 dp[i][1]에 들어간다. 👩‍💻 코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.*; public class Ma..

Algorithm/baekjoon 2022.02.17

가장 긴 바이토닉 부분 수열

📍 문제 설명 💡 접근 가장 긴 증가하는 부분 수열 + 가장 긴 감소하는 부분 수열을 합친 문제이다. 2개로 나뉜 배열에 최대 수열 길이 각각 넣는다. 예를 들면 inc_dp[1] = {1,5} = 2 dec_dp[1] = {5,4,3,2,1} = 5 가 된다 이 두개를 합치면 {1,5 5,4,3,2,1}이 되고 중복되는 5를 제거 하여 {1,5,4,3,2,1}을 만든다. 👩‍💻 코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.*; public class Main { static int n, m, answer; static int[][] board; static int[] arr, inc_dp, dec..

Algorithm/baekjoon 2022.02.16

가장 큰 증가 부분수열

📍 문제 설명 💡 접근 LIS 문제와 거의 동일한 문제 범위에 맞지 않거나(i = 0) 현재의 값이 이전 항들보다 제일 클 수 있으므로 초기화할 때 dp에 arr의 값들을 넣어준다. 2가지 조건을 만족하면 값을 바꿀 수 있다. 1. 이전 항의 숫자가 현재 항의 숫자보다 작아야 더할 수 있다. 2. 이전 항의 합 + 현재 항의 값이 현재 항의 합보다 커야한다. 👩‍💻 코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.*; public class Main { static int n, m, answer, min, max; static int[][] board; static int[] arr, dp; stati..

Algorithm/baekjoon 2022.02.16

포도주 시식

📍 문제 설명 💡 접근 n번 까지 포도주를 먹는 방법 중 최대로 마실 수 있는 배열을 사용한다. 3가지의 경우의 수가 있다. 1. 현재 포도주를 먹지 않았을 때는 바로 직전까지의 포도주를 먹을 수 있다. 2. 현재 포도주를 먹었을 때는 직전의 직전까지의 포도주를 먹을 수 있다. 3. 또 다른 경우로는 현재 포도주를 먹고 바로 직전의 포도주를 먹을 수도 있다. 그 중 최댓값을 넣는다. 👩‍💻 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main { static int n, m, k, min, max, answer = Int..

Algorithm/baekjoon 2022.02.16