알고리즘 & 자료구조 9

[백준] 3184번 - 양(JAVA)

| 풀이 - BFS를 이용한 그래프 유형의 문제이다. - 다른 그래프 문제와의 차이를 보자면, 늑대와 양의 수를 매번 확인해야 한다. --> 이를 위해 dfs() 메소드를 호출할 때 '.','v','o' 이어야 하며 방문하지 않았어야 합니다. - dfs() 메소드가 끝날 때마다 늑대의 수가 양의 수 이상일 경우에는 늑대의 수만 누적시켜주고 그 반대의 경우에는 양의 수만 누적시켜준다. | 입출력 bufferedreader 와 system.out.print 를 사용하여 입출력 했다. | 문제 풀이 import java.util.*; import java.io.*; public class Sheep_3184 { //마당 , 방문체크, 총 양, 총 늑대 static int R, C; static char[][]..

[백준] 14502번 -연구소(JAVA)

| 입출력 BufferedReader 로 입력을 받고 System.out.println 으로 출력했다. import java.io.*; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Lab_14502 { //1.벽을 3개 세운다. //2.바이러스를 퍼뜨린다. //3.최대 안전영역(0의갯수)를 구한다 // --> 이 값을 max 값과 계속 비교하면서 최대값을 구한다. public static int X; // X= M public static int Y; // Y= N public static int map[][]; public static int max = 0; public..

[백준] 11728번 -배열 합치기(JAVA)

| 접근 방법 말 그대로 두개의 배열을 입력받아 정렬하여 결과를 출력하면 된다. 이 때 정렬하는 방법은 두가지가 있다. 첫번째는 Arrays.sort 메소드를 사용하고 두번째는 두포인터를 사용하는 것이다. 두가지 다 다뤄보겠다. | 입출력 BufferedReader 를 사용하여 입력값을 받고 System.out.print 를 사용하여 출력했다. | 1.Arrays.sort 사용하기 import java.util.*; import java.io.*; public class CombineArray_11728 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStr..

[백준] 13144번 -List of Unique Numbers (JAVA)

1 2 3 1 2에서 1개 이상의 수를 뽑았을때 나올 수 있는 경우의 수는 12가지이다. 여기서 포인트는 연속한 1개이상의 수를 뽑아야 한다는 것이다..! 이 문제는 두포인터 알고리즘을 이용해서 풀 수 있다. 한개의 포인터는 차례대로 늘리고 다른 하나의 포인터는 점점 늘리는 식으로 활용하는 것이다. | 투 포인터(Two Pointers)란? 리스트에 순차적으로 접근해야 할 때 두 개의 점의 위치를 기록하면서 처리하는 알고리즘 정렬되어있는 두 리스트의 합집합에도 사용됨. | 접근 방식 1. l 을 차례대로 늘리고 , r은 점점 늘리는 식으로 두 포인터를 활용한다. : 두 포인터는 안봐도 될 부분을 안 보기 위한 알고리즘이다. ex) 1 2 3 1 2 수열이 있을때 l = 1, r = 1 에서 r = 2, ..

[백준] 2343번 - 기타 레슨(JAVA)

예제 입력 9 3 // 강의 9개 , 블루레이 3개 1 2 3 4 5 6 7 8 9 // 각 강의마다 기타 레슨의 길이 예제 출력 17 블루레이 3개에 각각 1 2 3 4 5 / 6 7 / 8 9 씩 들어간다. 블루레이는 모두 같은 크기이어야 하므로 최소 크기는 17이 된다. 이 문제는 블루레이의 최소 크기를 찾는 문제이다. 빠르게 탐색하기 위해서 우리는 이분탐색을 사용할 수 있다. | 이분탐색(Binary Search)이란? : 정렬된 배열 또는 리스트에 적합한 고속 탐색 방법이다. 배열의 중앙에 있는 값을 조사하여 찾고자 하는 항목이 왼쪽 또는 오른쪽 부분 배열에 있는지를 알아내어 탐색의 버위를 반으로 줄인다. 찾고자 하는 값이 속해있지 않은 부분은 전혀 고려할 필요가 없기 때문에, 매 단계에서 검색..

[백준]1759번 - 암호 만들기 (JAVA)

| 문제 이 문제는 C개의 알파벳을 탐색하여 중복 없이 L개를 고르는 문제이다. 그러므로 백트래킹을 사용해야 한다는 의미이며 그 방법들 중 DFS를 사용할 것이다. ( * 백트래킹과 DFS 에 대한 자세한 설명은 이전 게시글에 설명해놓았다.) https://turtle8760.tistory.com/90 | 문제 접근 방식 1. L과 C를 입력받는다 (L: 암호의 자릿수 C: 암호로 사용했을 가능성이 있는 알파벳의 개수) : 최소 1개의 모음, 최소 두개의 자음이 포함된다. --> 모음자음 판별하는 메서드 생성 2. 알파벳이 사전 순으로 나열된다.(bac X abc O) --> Arrays.sort 사용한다. 3. 암호의 각 알파벳을 중복하지 않고 모든 경우의 수를 탐색한다. ( aaci (X) aciw(..

[백준]15650번 - N과 M(2) (JAVA)

| 문제 이 문제는 1~ N까지의 수를 탐색하여 M개를 고르는 문제이다. 그러므로 우리는 정해진 숫자범위에서 탐색을 해야한다는 의미와 같다. 또한 이 말은 즉 백트래킹을 사용해야한다는 뜻이다. | 백트래킹(Backtracking) 이란? 말 그대로 되추적한다 라는 의미이다. 좀 더 알고리즘적으로 설명하자면, 어떤 노드의 '유망성'을 판단한 뒤, 해당 노드가 유망하지 않다면 부모 노드로 돌아가 다른 자식 노드를 찾는 방법이다. 즉, 모든 경우의 수를 찾아보지만, 그 중에서도 가능성만 있는 경우의 수를 찾아보는 방법이다. 백트래킹의 방법은 여러가지가 있지만 이번 문제에는 DFS 라는 알고리즘을 사용하게 될 것이다. | DFS 란? Depth-First-Search 의 약자이며 깊이를 우선 탐색한다는 의미이다..

[백준]6588번 - 골드바흐의 추측(JAVA)

| 문제 이 문제를 풀기 위해서는 먼저 소수를 판별하는 알고리즘을 알아야 한다. 소수란 무엇이고 그 알고리즘은 어떤것인지 알아보자. | 소수 : 1과 그 수 자기 자신만을 약수로 갖는 자연수이다. | 에라토스테네스의 체 대량의 소수를 한꺼번에 판별하고 자 할때 사용하는 것이 바로 에라토스테네스의 체이다. 소수가 되는 수의 배수를 지우면 남은 수는 소수가 된다'라는 원리로 동작한다. [ 절차 ] 1. 원하는 숫자까지의 값을 초기화 해준다 (배열에 값 넣기) 2. 2부터 시작해서 특정 숫자의 배수에 해당하는 숫자들을 모두 지운다. (자기 자신을 제외한 배수를 지운다) 3. 이미 지워진 숫자의 경우 건너뛰고 진행한다. [ 알고리즘 ] 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각..

[백준]10430번 - 나머지(JAVA)

| 문제 | 해결 이 문제는 사실 출력만 하는거라 어렵지 않았다. 출력방법은 Scanner, BufferedReader 둘 중 하나를 사용하여 해주면 될것 같다. *주의할 점 1. 한 줄에 한 개의 결과값을 출력해야 한다. 2. 나머지를 구해야하므로 변수를 int로 계산해야 한다. 먼저, 코드를 적기전에 왜 각각 두개의 식들이 같은지 증명을 하고 이해하면 좋을것 같아서 정리해보게 되었다. 위와같이 나머지와 연관된 식들을 모듈로 연산이라고 한다. | 모듈로 연산(Modulo Operation) - 어떤 한 숫자를 다른 숫자로 나눈 나머지를 구하는 연산으로, 나머지 연산(mod)이라고 한다. - A mod B 와 같은 형태로 표현한다. ( A % B = A mod B) 문제에서는 총 4개의 케이스가 나왔다...