본문 바로가기
반응형

알고리즘 PS/알고리즘 일반17

알고리즘 풀이용 코드 스니펫(Java) 1. 회의들(시작시간, 종료시간)을 종료시간을 기준으로 오름차순 정렬하려면 static ArrayList A; class Meeting implements Comparable { int s, e; Meeting (int s, int e) { this.s = s; this.e = e; } @Override public int compareTo(Meeting o) { if (this.e == o.e) { // 종료시간이 같은 회의라면 return this.s - o.s; // 시작시간 작은 회의가 앞쪽에 위치 } else { return this.e - o.e; // 종료시간이 작은 회의가 앞쪽에 위치 } } } Collections.sort(A); 2023. 2. 23.
백트래킹 vs DFS 알고리즘 문제를 풀다보면 DFS인 것 같은데 백트래킹으로 분류된 문제들이 있다. 헷갈린 부분이 있어서 이번 기회에 확실히 정리를 하고 넘어가고자 한다. * DFS (깊이 우선 탐색) 가능한 모든 경로를 다 탐색한다. 따라서, 불필요한 경로도 무조건 끝까지 탐색을 하기 때문에 경우의 수를 줄이지는 못한다. * 백트래킹 (Back-tracking) 답을 찾아가는 도중, 지금의 경로가 답이 될 것 같지 않으면 더이상 진행하지 않고 윗단계로 되돌아간다. 이를 가지치기라고 하는데, 불필요한 경우의 수를 줄일 수 있으므로 시간복잡도를 개선할 수 있다. 문제풀이에서는 DFS로 모든 경우의 수를 완전탐색하는 과정 중에 조건문을 걸어서 답이 절대로 나올 수 없는 상황을 정의하고, 해당이 되면 탐색 중단 후 그 이전으로 .. 2023. 2. 19.
코딩테스트 입력값 받기 (1) 첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100) 둘째 줄부터 N개 줄에는 그림이 주어진다. 5 RRRBB GGBBB BBBRR BBRRR RRRRR void inputData() throws Exception { InputStreamReader reader = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(reader); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); map = new char[N][N]; for (int i=0; i 2023. 2. 18.
PS 풀이결과 표기 방법 (◎ / ○ / △ ) ◎ : 문제의 이해부터 폴이 과정, 알고리즘 구현까지 완벽하게 혼자 힘으로 해결한 문제 → 다시 풀어볼 필요 없음. ○ : 문제는 풀었지만 반례를 통과 못하거나, 구글링을 통해 약간의 도움을 받아서 해결한 문제 → 다시 풀어보고 혼자 풀었으면 큐에서 삭제. △ : 어떻게 풀어야 할지 감도 못잡아서 구글링을 통해서야 이해한 문제 → 적어도 2번은 더 풀어볼 것. 2022. 12. 22.
닥익스트라 최단경로 알고리즘 다익스트라 알고리즘 '단계마다 방문하지 않은 노드 중에서 가장 최단 거리가 짧은 노드를 선택'한 뒤에, 그 노드를 거쳐 가는 경우를 확인하여 최단 거리를 갱신하는 방법이다. 우선순위 큐를 이용하여 풀 수 있다. 1. 문제가 주로 한 정점에서 다른 정점까지 가는 최단거리를 계산하는 게 주로 나온다. 2. Java의 경우 class Node를 만들어서 정점과 간선을 표현하자. // PriorityQueue 사용을 위해 Comparable 사용함 class Node implements Comparable { int v; // 정점 int c; // 이동값 Node (int v, int c) { this.v = v; this.c = c; } @Override public int compareTo(Node o) .. 2022. 10. 13.
그래프의 표현방식 (인접 행렬 vs 인접 리스트) * 인접 행렬 import java.util.Scanner; /* 정점, 간선의 개수 이후 (노드, 노드, 비용)이 주어진 경우 5 6 5 1 1 1 2 2 1 3 3 2 3 4 2 4 5 3 4 6 */ public class Graph { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // V = 정점의 개수, E = 간선의 개수. int V = sc.nextInt(); int E = sc.nextInt(); // 2차원 배열(인접 행렬)을 만든다. // 인덱스의 번호 = 노드의 번호 이기 때문에, 2차원 배열의 크기를 임의로 1 늘려서 정의한다(스킬). int[][] graph = new int[V + 1].. 2022. 10. 8.
플러드 필(Flood Fill) 알고리즘 플러드 필은 다차원 배열에서 어떤 칸과 연결된 영역을 찾는 알고리즘이다. 그림판에서 색 채우기 명령으로 동일한 색을 전부 바꿔버리는 것과 동일하다. 플러드 필 문제는 BFS/DFS 알고리즘으로 풀 수 있다. [BFS의 풀이과정] 1. 시작하는 칸을 큐에 넣고 방문 표시를 한다. 2. 큐에서 원소를 꺼내어 그 칸에 상/하/좌/우로 인접한 4개의 칸에 대해 탐색을 한다. 3. 해당 칸을 이전에 방문했다면 무시하고, 처음 방문했다면 방문 표시를 하고 해당 칸을 큐에 넣는다. 4. 큐의 모든 원소가 빌 때까지 2를 반복한다. 5. 모든 칸이 큐에 1번씩만 들어가므로 시간복잡도는 칸이 N개일 때 O(N)이다. ※ 참고 : https://blog.encrypted.gg/941 2022. 10. 1.
이분탐색 알고리즘(Upper Bound, Lower Bound) 오름차순으로 정렬된 배열에서 찾고자 하는 값 key가 있을 때, Upper Bound는 key보다 큰 첫번째 위치(초과)를 반환한다. Lower Bound는 key보다 크거나 같은 첫번째 위치(이상)블 반환한다. 예) 배열 {1, 3, 3, 5, 7}이 있을 때, key = 3이면 Upper Bound = 3(인덱스), Lower Bound = 1(인덱스)가 된다. key = 2이면 Upper Bound = 1(인덱스), Lower Bound = 1(인덱스)가 된다. lower bound, 하한은 찾고자 하는 값 '이상'의 값이 처음으로 나타나는 위치를 의미한다. 즉, 왼쪽부터 볼 때 찾고자 하는 값이 같거나 큰 경우를 처음 만나는 위치를 의미한다. key 값이 4일 때 처음 마주하는 키 값 이상을 갖고.. 2022. 9. 22.
Java의 자료구조 사용법 1. HashMap // key:String, data: Integer으로 선언 HashMap map = new HashMap(); // 값 삽입하기 for (String key : A) { map.put(key, map.getOrDefault(key, 0)+1); // key를 찾아서 그 값을 읽어서 +1해서 다시 입력하기. } // map에서 각 키의 값을 읽어서 제일 큰 수인 key를 고르는 구문 for (String key : map.keySet()) { if (map.get(key) > max) { max = map.get(key); ans = key; } } 2022. 9. 22.
반응형