[백준 20208] 진우의 민트초코우유 (골드 5)
Study/Algorithm

백트래킹?모든 가능한 방문 조합을 재귀적으로 시도해보고, 그중에서 유효한 것만 정답 후보로 선택모든 경우를 탐색하되, 중간에 불가능한 경로는 더 이상 가지 않고 돌아가는 알고리즘 해당 문제를 보고 백트래킹을 써야겠다는 생각이 들었다.하지만 구현하는 데에 좀 어려움을 겪었다.처음에 dx, dy로 한칸씩 이동하면서 초코우유를 먹으면서 체력을 늘리고 2를 0으로 바꾼 뒤에 다시 탐색해보는 방향으로 생각했는데 아주 잘못된 생각이었다. 이 문제의 목표는 최대한 많은 민트초코우유를 먹고, 집에 돌아올 수 있는 경우 중 우유의 최대 개수를 구하는 것이다.조건은 아래와 같다. N x N 크기의 마을 (map)진우의 집은 1, 민트초코우유는 2, 빈칸은 0진우는 상하좌우 한 칸 이동에 체력 1 소모민트초코우유를 먹으면..

[백준 32387] 충전하기 (골드 4)
Study/Algorithm

https://www.acmicpc.net/problem/32387 문제를 읽으면서 대충 요약하면서 정리해보았다.Node 클래스가 필요하다는 것을 먼저 파악하고 어떤 값이 들어갈지 고민해보았고,먼저, 인덱스와 전력 그리고 행동 순서 를 기억하고 있어야겠다고 생각했다.그리고 예시를 직접 테스트해보면서 내가 이해한 바가 맞는지 확인하였다.첫 코드package baekjoon._32387;//https://www.acmicpc.net/problem/32387import java.util.*;import java.io.*;public class Main { static int N, Q; static List multitab; public static void main(String[] args) throws E..

[백준 20040] 사이클 게임 ( 골드 4)
Study/Algorithm

https://www.acmicpc.net/problem/20040 유니온 파인드 관련된 문제를 찾아서 진행했다.두 점을 연결하는 과정을 거치면서 사이클이 완성되면 끝나는 게임이다. 두 점을 union하면서 isSameParent 로직으로 확인하면서 cycle이 발생하면 몇 번째 union 에서 발생했는지 출력하면 된다.* 중요 -> union하면서 parent[] 배열로 부모 점을 계속 변경해주어야 한다. 이때는 둘 중 작은 수로 부모를 변경해야 한다.union -> 두 점을 연결하고 같은 부모를 바라보게 한다.find -> 각 점의 부모를 찾는다.isSameParent -> 부모가 같은지 확인한다. 최종 코드package baekjoon._20040;import java.io.*;import java..

[백준 2638] 치즈 (골드 3)
Study/Algorithm

https://www.acmicpc.net/problem/2638처음 문제를 보았을 때 아래와 같이 판단하였다.1. BFS를 통해서 먼저 외부 공기(-1)를 구분한다.2. 배열을 순회하면서 외부 공기랑 2면 이상 닿으면 0으로 표시한다.3. 치즈가 없는지 판단한다.(1이 하나라도 있으면 true 반환) * 문제를 풀 때, 초기화 단계를 잊어버리는 경우가 많아서 체크하기 위해 따로 적어둔다. 하지만 while문을 통과하지 못하는 오류가 발생하였다.확인해보니 치즈를 녹이는 단계에서 외부 공기랑 2면 이상 닿았을 때 바로 0으로 바꾸는 것 때문에 제대로 다음 치즈들에 대해서 처리가 되지 않았다.또한 외부 공기를 한 번 확인하고 치즈를 녹이는데 다시 외부 공기를 확인할 때 외부 공기를 다시 판단해야하는데 초기화..

[백준 5525] IOIOI
Study/Algorithm

문제접근이 문제는 문자열 S 안에서 특정 패턴 Pn이 몇 번 등장하는지 확인하는 문제입니다.처음엔 입력 값을 제대로 확인하지 않고 서브 태스크1에 있는 것을 보고 1. i번째에서 i+3까지 자르고 i를 1개씩 올려가면서2. Substring한 문자열이 Pn과 같은지 확인하였습니다.이 경우 N이 매우 커졌을 경우에 2N+1 크기의 문자열을 M 번 확인해야하는 큰 연산이 걸려 매우 큰 시간복잡도가 나오게 됩니다.그렇기 때문에 다른 방법을 사용하여야겠다고 생각하였습니다.- 슬라이딩 윈도우 고정 사이즈의 윈도우가 이동하면서 윈도우 내에 있는 데이터를 이용해 문제를 풀이하는 알고리즘슬라이딩 윈도우를 사용하여 Pn 문자열에서는 공통된 pattern이 존재하기 때문에 'IOI'를 고정 윈도우로 지정하여 윈도 내에 있..

[백준 9465] 스티커
Study/Algorithm

문제접근DP 사용해서 이전의 결과값을 사용해서 효율적인 계산을 진행하였다.예시스티커를 뗀 부분이 O이고찢겨진 부분은 X라고 하자.(0,2) 위치의 스티커를 뗀 경우는 아래와 같이 나누어진다. 지금 목표는 스티커를 뗀 경우 중 가장 큰 값을 얻었을 때이기 때문에 이때 둘 중에 큰 값을 선택하고 (0,2) 위치의 스티커 값을 더해주면 된다.이외에 아무것도 떼지 않은 경우(1,1) 위치의 스티커를 뗀 경우 (0,3) 위치의 스티커를 뗀 경우는 아래와 같이 나누어진다. (1,2) 위치의 스티커를 뗀 경우(1,1) 위치의 스티커를 뗀 경우해당 값 중에 큰 값을 선택하고 (0,3) 위치의 스티커 값을 더해주면 된다. 그러면 아래와 같은 점화식을 얻을 수 있다.구한 점화식을 코드에 적용하면 아래 코드와 같다.코드im..

[백준 1987] 알파벳
Study/Algorithm

문제접근DFS 탐색을 통해서 말을 이동할 수 있는 경로 탐색이때, alphabets 배열을 통해서 중복된 알파벳의 경로로 가지 않도록 해야 한다고 생각하였다.alphabets 배열을 A~Z까지의 26의 크기를 가진 배열로 설정하였다.해당 알파벳의 정수 값에서 'A'의 정수값을 빼면 해당 알파벳의 인덱스 값이 되기 때문에 탐색한 경우 해당 배열 인덱스에 위치한 값을 true로 변환해주었다.백트래킹!!!!알파벳을 탐색하면서 중복 처리를 한 map에서 말의 움직임을 count한다.이때 다른 경로를 탐색하기 위해 중복 처리를 한 부분을 다시 원복시킨다.원복 시킨 것에서 다른 경로로 탐색하고 다시 중복처리를 진행하면서 말의 움직임을 또 count한다.탐색할 때마다 maxCount를 최댓값으로 갱신해주면서 최종 값..

[백준 11726] 2*n 타일링
Study/Algorithm

문제접근2*1 의 경우는 1가지2*2의 경우는 2가지2*3의 경우는 3가지...규칙이 있는 것을 찾아냈다.예를 들어 n=5인 경우, 마지막 2*1 부분  빼고 모두 차있는 경우 + 마지막 2*2 부분이 가로로 채워져 있고 모두 차있는 경우두 가지 경우를 더한 경우의 수가 모든 경우의 수이다.점화식 : dp[i] = dp[i-1] + dp[i-2]코드import java.util.*;public class Main { static int[] dp; static int N; public static void main(String[] args) { Scanner sc = new Scanner(System.in); N = sc.nextInt(); dp = n..

[백준 11725] 트리의 부모 찾기
Study/Algorithm

문제https://www.acmicpc.net/problem/11725접근인접 리스트로 트리 생성DFS 로 루트 노드 1부터 탐색탐색 시 해당 노드의 부모를 parents 배열에 기록한다.노드 탐색 시 다시 부모 노드를 탐색하지 않기 위해 주의!코드import java.util.*;import java.io.*;public class TreeParent_11725 { static List[] tree; static int[] parents; static int N; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamRe..

[백준 14502] 연구소
Study/Algorithm

문제접근완전 탐색을 통해서 현재 주어진 맵에서 벽 3개를 세우는 모든 경우의 수를 구해야 한다고 생각했다. -> 백트래킹경우의 수 별로 바이러스가 퍼진 것을 파악해 안전지대가 최대 크기인 경우를 출력해야 한다고 생각했다.이 때 바이러스가 퍼진 것은 BFS를 통해서 구현하고자 했다.풀이입력 처리 및 초기화:BufferedReader와 StringTokenizer를 사용하여 입력을 처리하고, 격자 크기(N x M)와 map 배열을 초기화합니다.map 배열에는 현재 연구소의 상태를 저장하고, tempMap 배열은 바이러스가 퍼졌을 때의 상태를 저장합니다.벽 설치 (buildWalls 메소드):3개의 벽을 세우기 위해 백트래킹을 사용합니다.벽이 3개 설치되면 (count == WALL_COUNT), 바이러스가 ..