전체 글 372

018 : ATM 인출 시간 / insertion sort

pointer 배정 찾기 두번째부터 시작해서 작은수를 왼쪽에 계속 모으는 것 lsq는 standard poll로 작용하고 left area에 삽입할 것을 찾는다 *하나라도 작은 걸 찾으면 작은것 - 큰것이 되게 오른쪽 것을 pointer로 잡고 break; 최대한 작은 것을 찾아 들어가는 것이 아닌, 점차 완성되는 그림으로 착각할 수 있지만 왼쪽 2의 구간부터 차례로 쌓여가므로 squeezer poll이 지나간 la에서는 오름차순으로 정렬되어 있다 lsq poll에서 삽입할 value를 이미 얻었으므로 지워버려도 된다 S와 TP의 capacity는 동일하다 1번 2번 .. 5번 1번째까지 합, 2번째까지합.. 5번째까지 합 import java.util.Scanner; public class Main {..

017 : selection sort / 내림차순

char에서 Int로 parsing 안됨 > substring으로 하기 lsq가 standard pointer가 된다 또 비교를 위한 pointer가 필요 max값이 갱신될때마다 바뀌면 안되고, 최종 max값을 찾은 후 j for문 밖에서 갱신해야 하므로 Pointer plate(max)를 준비, 갱신되면 받아서 나온다 import java.util.Scanner; public class Main { public static void main(String[] args) { // ISc Scanner sc = new Scanner(System.in); String line = sc.nextLine(); // D2F int[] TP = new int[line.length()]; for (int i = 0; ..

020 : merge sort // 수 정렬하기

flush와 close recursive bottom(최소 피스) 구간 나눠서 하청 주기 작성할 connector / pointer 확인 (TP connector와 pointer / cont connector와 pointer x 2 사용) LEFTOVER import java.io.*; public class Main { static int[] TP; static int[] cont; public static void main(String[] args) throws IOException { // ISC BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(n..

023 : DFS = connected component

하나의 DFS 세션에서 끝이나지 않는다면, (더 방문할 노드가 남아있다면) 해당 노드를 포함한 연결체와 떨어져있는 다른 연결체 방문이 필요하다 해당 EP가 왜 필요한가? import java.util.ArrayList; import java.util.Scanner; public class Main { static ArrayList[] TP; static boolean[] visited; public static void main(String[] args) { // ISC Scanner sc = new Scanner(System.in); int V = sc.nextInt(); int E = sc.nextInt(); // D2F TP = new ArrayList[V+1]; for (int i = 1; i

015 : 버블 정렬

오른쪽에서 조여오는 squeezer를 두는데, 우선 1~V를 다 돌아야 하므로, sq는 0부터 시작한다 그리고 일반 tp는 전체에서 sq만큼 뺀 경계선 느낌으로 할당하면 된다 모든 노드들이 한번에 정렬되지는 않지만, 제일 큰 노드는 있어야 할 곳으로 배치된다 (오른쪽으로 보낼만 하면 보내고 / 그것보다 더 큰게 있으면 가만히 놔둔다) 가만히 놔두면서 새로운 큰 것이 나타나면, 그것을 오른쪽으로 보낸다 import java.util.Scanner; public class Main { public static void main(String[] args) { // ISc Scanner sc = new Scanner(System.in); int V = sc.nextInt(); // D2F int[] TP = n..

025 : DFS 친구관계 파악하기

0번 노드부터 V-1번 노드까지 모두 IS로 보낸다 하나라도 체크인되면 나머지는 필요없다. 모든 쌍을 구하는 게 아닌, 존재하느냐의 문제이므로 for / while에서 break = DFS와 같은 method에서 return pointer와 depth를 사용하여, recursive 시 depth를 보충해 줄 수 있다 (pipeline patch) depth == 5 로 끝내지는 게 아닌 "depth > checkin > break;" signalling 하는 이유는 depth는 DFS안에서 계속 변화하기 때문에 순간을 catch하기 어렵고, 하나의 DFS시작점이 끝나야 for linear 공간은 중 하나가 끝나기 때문이다 비보존 patch - BFS라면 이렇게 해서는 안되지만, DFS 끝에 patch가 ..

028 : 트리의 지름 구하기

가중치를 사용하기 위해 Edge Class를 구현했더라도(ArrayList[] TP) 와 달리 BFS에서는 Edge를 가져와 pointer로만 탐색 사용, Patch로 value를 사용해도 된다(반은 넣고 반은 사용) * 하나의 BFS시작에서 먼 노드, 그리고 그 노드에서 반대 방향으로 먼 노드 2개만 판단하므로, 중복해서 업데이트 할 필요가 없다 (D patch시 if 조건 X) 불순물은 if pipeLine으로 따로 빼 둬서 만약 -1이 있다면 자동으로 해당 위상 공간으로 흘러갈 것이다. 그러므로 나머지 정제된 것은 원래대로 바로 값들을 TP로 넣어주면 된다 (단방향 작업) BFS는 Print작업이 아닌, D만 건드려서 업데이트한다 BFS(시작) + 먼곳의 pointer BFS(먼곳) + 다음 먼곳 ..

010 : Deque + Sliding Window

오른쪽으로 쌓고, 왼쪽으로 잘라낸다 3가지 작업 (인식자 = 넣을거) - 넣기 - 넣을 때 L을 벗어나는 것 제거(4-3 = 1) - 넣는것보다 큰것은 미리 제거하고 넣음 *접근 : field > pointer(deque.getFirst()); *connector를 사용 / 별도 class Node 사용 *for i 의 connector 외에 별도 기수 할당이 필요하면 Node를 사용(특히 비교) import java.io.*; import java.util.Deque; import java.util.LinkedList; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOE..

012 : Stack으로 오큰수 구하기

value가 아닌 pointer를 stack에 넣고 필요하면 connector를 사용하는 방식 비교 후 OEC를 작성해야 해서 현재 stack[]과 TP[] 비교 그리고 둘 다 pointer를 사용하여 connector인 TP 필요 지금 pointer는 stack에 들어있는 것으로(0~) 비교 대상 pointer는 i로(1~) 지금값과 오른쪽의 값을 사용해야 하므로 0을 SP로 넣고 (다른 TP의) 1과 비교 시작 stack.pop()과 OEC 작성 2가지 작업이 동시에 일어난다(한줄에) System.out.print랑 똑같이 작용