본문 바로가기

알고리즘/백준

(18)
백준 - 2636번 치즈 - java https://www.acmicpc.net/problem/2636 접근법 오랜만에 감 다시 잡아야해서 살짝 쉬운문제로 꺼냈다 기본적인 BFS로 풀었다 1. 치즈가 모두 녹았는지 체크해서 모두 0이면, 반복문 종료 1-1. checkZero로 그냥 배열 탐색해서 0이 아니면 바로 false 리턴시키고, while 문 진입 2. TIME변수 값 증가시킴으로 시간흐름 현재 치즈배열을 로직에 따라 1시간 후 치즈로 변경 cheese = bfs(cheese) 3. bfs안에서는 우선 현재 치즈덩어리 개수를 MASS에 기록해둠 (0,0)에는 치즈가 놓이지 않은 공기 공간이니까 여기를 bfs로 탐색해서 구멍인 공간(0)과 외부공간(2)로 구분함 retArray를 주석에 설명한대로 완성해서 리턴함 소스 import j..
백준 - 17070번 파이프 옮기기 1 - java https://www.acmicpc.net/problem/17070 이전 파이프의 상태에 따라서 다음 파이프가 3가지 타입으로 선택이 가능함 접근법 경우의 수를 따지는 BFS로 접근하였는데, 대부분 DP로 푼것 같다,, TODO DP로 푸는법도 해봐야할듯 끝좌표를 기준으로 BFS 탐색을 하는데, Pipe클래스를 만들어서 이전 파이프 타입을 챙김 curType의 값에 따라 3가지로 분기해서 경우를 따져보고, 해당되면 queue에 넣어줌 현재 좌표가 끝지점이면 answer값 올려주고, 다음 경우 탐색 애초에 끝지점이 1이면, 무조건 불가하니 0 출력하고 리턴 소스 import java.util.*; import java.io.*; public class Main { static int N; static in..
백준 - 1719번 택배 - java https://www.acmicpc.net/problem/1719 접근법 다익스트라로 최단거리를 구하기 위해 ArrayList[] ADJ 배열을 생성함 배열에 양방향으로 간선 연결을 해줌2차원 배열로 하게되면, 연결되어있는지 아닌지 n번 탐색을 해야하는데, arrayList면 size만큼만 탐색하면 되니 시간을 아낄 수 있음 각각의 노드를 기준으로 다익스트라 함수를 탐색 path[] 배열로 현재 노드의 앞 노드를 기록해둠 출력 시, 현재 노드면 -를 출력 그게 아니라면, 현재 노드에서 앞 노드를 찾고, 그게 끝인지 보고 아니면 또 앞 노드, ... 반복하여 출력 소스 import java.io.BufferedReader; import java.io.IOException; import java.io.Inp..
백준 - 11048번 이동하기 - java https://www.acmicpc.net/problem/11048 접근법 기본적인 DP 풀이법 핵심은 DP[nextX][nextY] < DP[x][y] + Array[nextX][nextY]를 판단해서 더 큰 경우 DP배열을 갱신해주고 출력할 때는 마지막 (N-1, M-1)값을 출력해줌 소스 import java.util.*; import java.io.*; public class Main { static int N, M; static int[][] Array; static int[][] DP; static int[][] dir = {{1,0},{0,1},{1,1}}; public static void main(String[] args) throws IOException { BufferedReader ..
백준 - 11779번 최소비용 구하기 2 - java https://www.acmicpc.net/problem/11779 접근법 기본적인 다익스트라 알고리즘으로 접근함 GRAPH라는 배열에 시작지점 인덱스에 도착지와 가중치를 Node로 담아두고, 입력으로 받는 시작지점과 끝지점으로 함수 시작 dir이라는 배열을 하나 두었는데, 해당 인덱스로 도착할 때 출발했던 인덱스를 저장함. 단, 가중치가 가장 작은 경우에만 갱신하며 이는 큐에 offer할때와 같은 시점에 이루어짐 우선순위 큐를 이용해야 시간초과 안뜸 if(weight[cur.index] < cur.weight) continue으로 현재 가중치 비교해서 건너뛰어줘야 시간을 아낌. 이 라인은 기존 다익스트라에서 해주지 않았던것 같은데 최소 비용만 출력하면 weight배열값만 출력하면 되는데, 방문한 도시 ..
백준 - 2623번 음악프로그램 - java https://www.acmicpc.net/problem/2623 접근법 기본적인 위상정렬문제로 쉽게 해결! 위상정렬의 핵심은 inDegree 배열. 각 인덱스별로 앞서 필요한 항목의 수 만큼 count를 가지고 있고, 조치가 취해지면 count를 깍아나가는 식으로 접근하면 됨 graph는 선행 -> 후행의 관계를 잡기위해 마련한 변수. 입력에 따라 선행, 후행 관계를 graph 배열의 인덱스에 맞게 생성. 생성하면서 후행이 되는 인덱스는 inDegree 배열 값도 올려줌 초기에는 inDegree배열이 0인 값 = 선행조건이 없는 값을 Queue에 넣어주고 반복문 소스 import java.util.*; import java.io.*; public class Main { static int N; // 가..
백준 - 1600번 말이 되고픈 원숭이 - java https://www.acmicpc.net/problem/1600 참고하게된 블로그 https://simju9397.tistory.com/25 접근법 처음에는 DFS로 풀이를 하였는데, 메모리초과가 나옴. 전체탐색하는 방법으로 생각해서 그런건데 잘못접근하여서 BFS로 바꿈. Point객체는 좌표 x, y와 이동한 횟수, 말처럼이동한 횟수를 가짐 Dir배열은 0~7은 말처럼 이동하는 경우의 좌표이고, 8~11은 일반 상하좌우 이동 일반 BFS처럼 Queue 생성해서 방문여부 체크하며 진행하는데, 여기서 시간초과나오고 했던 부분이 있음Visit x, y, z 배열의 의미가 중요한데, '말처럼 Z번 움직여서 X, Y좌표에 방문하였는가?'를 의미함 3-1. Z는 0번부터 K번까지이므로 크기는 K+1 짜리 3차원..
백준 - 1976번 여행 가자 - java https://www.acmicpc.net/problem/1976 접근법 다른 사람들은 어떻게 풀었는지 꼭 확인이 필요.. 마지막줄에 A->B->D... 이런식으로 여행가고자하는 지점을 주는데, 방문했던 장소를 다시가도 상관없고, 최단거리로 이동해야할 필요도 없음. 그래서 이런식으로 생각함. 인접행렬이 주어지면, BFS를 통해 해당 노드로 부터 갈 수 있는 묶음(=ArrayList)을 만들어줌 만들면서, INDEX[]배열에 각각의 노드가 어떤 인덱스 번호를 가진 위치에 속해있는지를 따로 결정해줌 가고자하는 첫번째 노드의 인덱스를 groupNum으로 지정하고, 가려고하는 모든 노드의 인덱스가 groupNum과 같은지를 비교 = 같은 그룹에 속해있는지 판단 3-1. 탐색하다가 속해있지 않으면, NO 리턴. ..