From 6088b50c6c78408e9523eb1688b8d9038dfd1997 Mon Sep 17 00:00:00 2001 From: BoSang Yoon <123609458+YoonBoSang@users.noreply.github.com> Date: Wed, 3 Apr 2024 23:57:27 +0900 Subject: [PATCH] =?UTF-8?q?yoonbosans-=EC=97=B0=EA=B2=B0=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- YoonBoSang/{ => 1week-Array}/10808.java | 0 YoonBoSang/{ => 1week-Array}/Array.java | 0 YoonBoSang/{ => 1week-Array}/ArrayList.java | 0 YoonBoSang/{ => 1week-Array}/array_test.java | 0 YoonBoSang/2week-LinkedList/1406_1.java | 148 ++++++++++++++++++ YoonBoSang/2week-LinkedList/LinkedList.java | 84 ++++++++++ YoonBoSang/2week-LinkedList/List_Example.java | 20 +++ 7 files changed, 252 insertions(+) rename YoonBoSang/{ => 1week-Array}/10808.java (100%) rename YoonBoSang/{ => 1week-Array}/Array.java (100%) rename YoonBoSang/{ => 1week-Array}/ArrayList.java (100%) rename YoonBoSang/{ => 1week-Array}/array_test.java (100%) create mode 100644 YoonBoSang/2week-LinkedList/1406_1.java create mode 100644 YoonBoSang/2week-LinkedList/LinkedList.java create mode 100644 YoonBoSang/2week-LinkedList/List_Example.java diff --git a/YoonBoSang/10808.java b/YoonBoSang/1week-Array/10808.java similarity index 100% rename from YoonBoSang/10808.java rename to YoonBoSang/1week-Array/10808.java diff --git a/YoonBoSang/Array.java b/YoonBoSang/1week-Array/Array.java similarity index 100% rename from YoonBoSang/Array.java rename to YoonBoSang/1week-Array/Array.java diff --git a/YoonBoSang/ArrayList.java b/YoonBoSang/1week-Array/ArrayList.java similarity index 100% rename from YoonBoSang/ArrayList.java rename to YoonBoSang/1week-Array/ArrayList.java diff --git a/YoonBoSang/array_test.java b/YoonBoSang/1week-Array/array_test.java similarity index 100% rename from YoonBoSang/array_test.java rename to YoonBoSang/1week-Array/array_test.java diff --git a/YoonBoSang/2week-LinkedList/1406_1.java b/YoonBoSang/2week-LinkedList/1406_1.java new file mode 100644 index 0000000..dc33cb9 --- /dev/null +++ b/YoonBoSang/2week-LinkedList/1406_1.java @@ -0,0 +1,148 @@ +import java.util.*; +import java.io.*; + +public class Main{ + static int unused = 1; + static final int MX = 1000005; + static String[] dat = new String[MX]; + static int[] pre = new int[MX]; + static int[] nxt = new int[MX]; + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + Arrays.fill(pre, -1); + Arrays.fill(nxt, -1); + + String init = br.readLine(); + int cursor = 0; + for (String c : init.split("")) { + insert(cursor, c); + cursor++; + } + + int q = Integer.parseInt(br.readLine()); + while (q-- > 0) { + String op = br.readLine(); + if(op.equals("L")) { + if(pre[cursor] != -1) { + cursor = pre[cursor]; + } + } else if(op.equals("D")) { + if(nxt[cursor] != -1) { + cursor = nxt[cursor]; + } + } else if(op.equals("B")) { + if(pre[cursor] != -1) { + erase(cursor); + cursor = pre[cursor]; + } + } else { + String add = op.substring(2,3); + insert(cursor, add); + cursor = nxt[cursor]; + + } + } + + traverse(); + } + + static void insert(int addr, String num) { + dat[unused] = num; + pre[unused] = addr; + nxt[unused] = nxt[addr]; + if(nxt[unused] != -1) { + pre[nxt[unused]] = unused; + } + nxt[addr] = unused; + unused++; + } + + static void erase(int addr) { + nxt[pre[addr]] = nxt[addr]; + if(nxt[addr] != -1) { + pre[nxt[addr]] = pre[addr]; + } + } + + static void traverse() throws Exception { + int cur = nxt[0]; + String answer = ""; + while (cur != -1) { + answer += dat[cur]; + cur = nxt[cur]; + } + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + bw.write(answer); + } + + // public static void main(String[] args) throws Exception { + // BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + // BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + + // final int MX = 100000; + // String[] dat = new String[MX]; + // int[] nxt = new int[MX]; + // int[] pre = new int[MX]; + + // Arrays.fill(pre, -1); + // Arrays.fill(nxt, -1); + + // String[] arr = br.readLine().split(""); + // int len = arr.length; + // int cur = len - 1; + + // for(String s : arr) { + // int i = 0; + // dat[i] = s; + // if(i != 0) { + // pre[i] = i - 1; + // } + // if(i + 1 != len) { + // nxt[i] = i + 1; + // } + // i++; + // } + + // int len2 = Integer.parseInt(br.readLine()); + // int f = 0; + // for(int i = 0; i < len2; i++) { + // String s = br.readLine(); + // if(s.equals("L")) { + // if(cur != 0) { + // cur--; + // } + // } else if(s.equals("D")) { + // if(cur != len -1) { + // cur++; + // } + // } else if(s.equals("B")) { + // if(cur != 0) { + // nxt[cur-1] = nxt[cur]; + // } + // if(nxt[cur] != -1) { + // pre[cur+1] = pre[cur]; + // } + // } else { + // dat[len] = s.substring(2,3); + // if(cur != 0) { + // pre[len] = cur; + // } else { + // f = len; + // } + // nxt[len] = nxt[cur]; + // nxt[cur] = len; + // if(nxt[cur] != -1) { + // pre[nxt[cur]] = len; + // } + // len++; + // } + // } + // String answer = dat[f]; + // while(f != -1) { + // answer += dat[nxt[f]]; + // f = nxt[f]; + // } + // bw.write(answer); + // } +} \ No newline at end of file diff --git a/YoonBoSang/2week-LinkedList/LinkedList.java b/YoonBoSang/2week-LinkedList/LinkedList.java new file mode 100644 index 0000000..d0d6916 --- /dev/null +++ b/YoonBoSang/2week-LinkedList/LinkedList.java @@ -0,0 +1,84 @@ +// 첫번째 원소의 주소만 알고있기에 k번째 원소를 확인/변경하기 위해 O(k)가 필요함 +// 임의의 위치의 전원소의 주소를 알고있다면 임의의 위치에 원소를 추가/제거는 O(1) 모른다면 O(N) +// 원소들이 메모리 상에 연속해있지 않아 Cache hit rate가 낮지만 할당이 다소 쉬움 + +// 단일 연결 리스트(Singly Linked List) +// 각 원소가 자신의 다음 원소의 주소를 가지고 있는 연결 리스트 + +// 이중 연결 리스트(Doubly Linked List) +// 각 원소가 이전/다음 원소의 주소를 가지고 있는 연결 리스트 + +// 원형 연결 리스트(Circular Linked List) +// 원소의 끝이 처음의 주소를 가지고 있는 연결 리스트(단일,이중 둘다 가능) + +// 첫번째 원소의 주소만 알고있기에 + +import java.util.*; + +public class LinkedList { + private int unused = 1; + + public static void main(String[] args) { + final int MX = 1000005; + int[] dat = new int[MX]; + int[] pre = new int[MX]; + int[] nxt = new int[MX]; + + Arrays.fill(pre, -1); + Arrays.fill(nxt, -1); + + } + + void insert(int addr, int num) { + dat[unused] = num; + pre[unused] = addr; + nxt[unused] = nxt[addr]; + nxt[addr] = unused; + if(nxt[unused] != -1) { + pre[nxt[unused]] = unused; + } + unused++; + } + + void erase(int addr) { + nxt[pre[addr]] = nxt[addr]; + if(nxt[addr] != -1) { + pre[nxt[addr]] = pre[addr]; + } + } + + void traverse() { + int cur = nxt[0]; + while (cur != -1) { + System.out.println(dat[cur] + " "); + cur = nxt[cur]; + } + System.out.printf("\n\n"); + } + + void insert_test() { + System.out.println("****** insert_test *****"); + insert(0, 10); // 10(address=1) + traverse(); + insert(0, 30); // 30(address=2) 10 + traverse(); + insert(2, 40); // 30 40(address=3) 10 + traverse(); + insert(1, 20); // 30 40 10 20(address=4) + traverse(); + insert(4, 70); // 30 40 10 20 70(address=5) + traverse(); + } + + void erase_test() { + System.out.println("****** erase_test *****"); + erase(1); // 30 40 20 70 + traverse(); + erase(2); // 40 20 70 + traverse(); + erase(4); // 40 70 + traverse(); + erase(5); // 40 + traverse(); + } +} \ No newline at end of file diff --git a/YoonBoSang/2week-LinkedList/List_Example.java b/YoonBoSang/2week-LinkedList/List_Example.java new file mode 100644 index 0000000..95ed586 --- /dev/null +++ b/YoonBoSang/2week-LinkedList/List_Example.java @@ -0,0 +1,20 @@ +import java.util.*; + +public class Main { + public static void main(String[] args) { + List L = new LinkedList<>(); + L.addLast(1); + L.addLast(2); + ListIterator t = L.listIterator(); // t는 1의 앞에서 커서로 가르키는중 + L.addFirst(10); // 10 1 2 + L.addLast(5); // 10 1 2 5 + L.add(t.next(), 6); // t가 가르키는 곳 앞에 6을 샆입, 10 6 1 2 5 + // t.next()로인해 t가 한칸 전진, 현재 t가 가르키는 값은 2 + L.remove(t.next()); // t의 커서 뒤의 값을 제거 + // 10 6 1 5, t의 커서 위치는 5의 앞 + for (int i : L) { + System.out.println(i + " "); + } + System.out.println(); + } +} \ No newline at end of file