From 6ace5c3222449e8e185a55bc022ba159cdd2f211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B5=9C=EC=A7=84=EC=9A=B0?= Date: Sun, 30 Aug 2026 13:05:44 +0900 Subject: [PATCH 1/5] =?UTF-8?q?week8/=EA=B0=80=EC=9E=A5=20=EA=B8=B4=20?= =?UTF-8?q?=ED=8C=B0=EB=A6=B0=EB=93=9C=EB=A1=AC/nonani?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Solution.java" | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 "src/week8/\352\260\200\354\236\245 \352\270\264 \355\214\260\353\246\260\353\223\234\353\241\254/Solution.java" diff --git "a/src/week8/\352\260\200\354\236\245 \352\270\264 \355\214\260\353\246\260\353\223\234\353\241\254/Solution.java" "b/src/week8/\352\260\200\354\236\245 \352\270\264 \355\214\260\353\246\260\353\223\234\353\241\254/Solution.java" new file mode 100644 index 0000000..fcc390c --- /dev/null +++ "b/src/week8/\352\260\200\354\236\245 \352\270\264 \355\214\260\353\246\260\353\223\234\353\241\254/Solution.java" @@ -0,0 +1,51 @@ +/* +## ✏️ [프로그래머스] 가장 긴 팰린드롬 +📶 문제 난이도 +Lv. 3 + +🔗 문제 링크 +https://school.programmers.co.kr/learn/courses/30/lessons/12904 + +⏱️ 풀이 시간 +10분 + +✅ 풀이 근거 + + + */ + +// 브루투포스 해도 될듯 + +// i를 시작, j를 끝으로 하는 애가 팰린드롬인지 체크하는건 j-i / 2 번 연산 +// O(N^2) 으로 해결될 것이다. +// 아 N^3 이네 +class Solution { + public int solution(String s) { + int answer = 0; + + for (int i = 0; i < s.length(); i++) { + for (int j = s.length() - 1; j >= 0; j--) { + if (answer < j - i + 1 && check(s.substring(i, j + 1))) { + answer = j - i + 1; + // System.out.println(s.substring(i, j+1) +" " + answer); + } + } + } + + return answer; + } + + private boolean check(String str) { + int l = 0; + int r = str.length() - 1; + while (l < r) { + if (str.charAt(l) != str.charAt(r)) + return false; + l++; + r--; + } + return true; + } +} + + From 61432430c0ab5bd006164c8d3ee2bfafddd95e0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B5=9C=EC=A7=84=EC=9A=B0?= Date: Sun, 30 Aug 2026 13:05:53 +0900 Subject: [PATCH 2/5] =?UTF-8?q?week8/=EB=A6=AC=EC=BD=94=EC=B1=97=20?= =?UTF-8?q?=EB=A1=9C=EB=B4=87/nonani?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Solution.java" | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 "src/week8/\353\246\254\354\275\224\354\261\227\353\241\234\353\264\207/Solution.java" diff --git "a/src/week8/\353\246\254\354\275\224\354\261\227\353\241\234\353\264\207/Solution.java" "b/src/week8/\353\246\254\354\275\224\354\261\227\353\241\234\353\264\207/Solution.java" new file mode 100644 index 0000000..fdd8d4d --- /dev/null +++ "b/src/week8/\353\246\254\354\275\224\354\261\227\353\241\234\353\264\207/Solution.java" @@ -0,0 +1,129 @@ +/* +## ✏️ [프로그래머스] 리코챗 로봇 + +📶 문제 난이도 +Lv. 2 + +🔗 문제 링크 +https://school.programmers.co.kr/learn/courses/30/lessons/169199 + +⏱️ 풀이 시간 +30분 + +✅ 풀이 근거 +Bfs 문제인데 그냥 상하좌우 한칸이 아니라 벽까지 쭉 밀어버리면 되는 문제 +*/ + +import java.util.*; + +class Node { + int x, y, cnt; + + public Node(int x, int y, int cnt) { + this.x = x; + this.y = y; + this.cnt = cnt; + } +} + +class Solution { + int N, M; + int[][] map; + + public int solution(String[] board) { + int answer = 0; + this.N = board.length; + this.M = board[0].length(); + + map = new int[N][M]; + int startX = 0; + int startY = 0; + int targetX = 0; + int targetY = 0; + + for (int i = 0; i < N; i++) { + for (int j = 0; j < M; j++) { + char c = board[i].charAt(j); + + if (c == 'D') { + map[i][j] = 1; + continue; + } + if (c == 'G') { + targetY = i; + targetX = j; + continue; + } + if (c == 'R') { + startY = i; + startX = j; + continue; + } + } + } + + + boolean[][] visited = new boolean[N][M]; + ArrayDeque q = new ArrayDeque<>(); + + q.add(new Node(startX, startY, 0)); + visited[startY][startX] = true; + + while (!q.isEmpty()) { + Node cur = q.poll(); + + for (int d = 0; d < 4; d++) { + Node next = getNext(cur, d); + if (next.y >= 0 && next.y < N && next.x >= 0 && next.x < M && !visited[next.y][next.x]) { + visited[next.y][next.x] = true; + q.add(next); + if (next.y == targetY && next.x == targetX) return next.cnt; + } + } + } + + return -1; + } + + private Node getNext(Node cur, int d) { + int x = cur.x; + int y = cur.y; + + // 좌 + if (d == 0) { + while (x > 0) { + if (map[y][x - 1] == 1) + break; + x--; + } + } + + // 우 + else if (d == 1) { + while (x < M - 1) { + if (map[y][x + 1] == 1) + break; + x++; + } + } + + // 상 + else if (d == 2) { + while (y > 0) { + if (map[y - 1][x] == 1) + break; + y--; + } + } + + // 하 + else { + while (y < N - 1) { + if (map[y + 1][x] == 1) + break; + y++; + } + } + return new Node(x, y, cur.cnt + 1); + } +} \ No newline at end of file From 4288f3a1cdf4bae9c89dbda29cc0c23708a8bb07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B5=9C=EC=A7=84=EC=9A=B0?= Date: Sun, 30 Aug 2026 13:06:01 +0900 Subject: [PATCH 3/5] =?UTF-8?q?week8/=EC=B6=A9=EB=8F=8C=EC=9C=84=ED=97=98?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0/nonani?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Solution.java" | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 "src/week8/\354\266\251\353\217\214\354\234\204\355\227\230 \354\260\276\352\270\260/Solution.java" diff --git "a/src/week8/\354\266\251\353\217\214\354\234\204\355\227\230 \354\260\276\352\270\260/Solution.java" "b/src/week8/\354\266\251\353\217\214\354\234\204\355\227\230 \354\260\276\352\270\260/Solution.java" new file mode 100644 index 0000000..2284857 --- /dev/null +++ "b/src/week8/\354\266\251\353\217\214\354\234\204\355\227\230 \354\260\276\352\270\260/Solution.java" @@ -0,0 +1,107 @@ +/* +## ✏️ [프로그래머스] 할인 행사 + +📶 문제 난이도 +Lv. 2 + +🔗 문제 링크 +https://school.programmers.co.kr/learn/courses/30/lessons/131127 + +⏱️ 풀이 시간 +30분 + +✅ 풀이 근거 +// n, x가 100 보다 세제곱도 가능 따라서 브루트포스 문제 +*/ + +import java.util .*; + +// class Node{ +// int x, y, depth; +// ArrayList paths; +// public Node(int x, int y, int depth, ArrayList paths) { +// this.x = x; +// this.y = y; +// this.depth = depth; +// this.paths = paths; +// } +// } + +class Solution { + public int solution(int[][] points, int[][] routes) { + int answer = 0; + int[][][] visited = new int[30000][101][101]; // [sec][x][y] sec초에 (x, y)를 몇회 방문함 + + for (int[] route : routes) { + + int sec = 0; + + int[] start = points[route[0] - 1]; + + int fromY = start[0]; + int fromX = start[1]; + + // 최초 시작 위치만 한 번 기록 + visited[sec][fromX][fromY]++; + + for (int node = 0; node < route.length - 1; node++) { + + int[] to = points[route[node + 1] - 1]; + + int toY = to[0]; + int toX = to[1]; + + while (fromY != toY) { + if (fromY < toY) { + fromY++; + } else { + fromY--; + } + + sec++; + visited[sec][fromX][fromY]++; + } + + while (fromX != toX) { + if (fromX < toX) { + fromX++; + } else { + fromX--; + } + + sec++; + visited[sec][fromX][fromY]++; + } + } + } + + // for (int s = 0; s < 8; s++) { + // printArr(visited[s]); + // } + + for (int[][] s : visited) { + for (int[] i : s) { + for (int j : i) { + if (j > 1) { + // 방문횟수가 1보다 크면 두개 이상의 로봇이 같은 초에 방문했으므로 충돌했다는 뜻 + answer++; + } + } + } + } + + return answer; + } + + private void printArr(int[][] arr) { + + for (int i = 0; i < 8; i++) { + for (int j = 0; j < 8; j++) { + System.out.print(arr[i][j] + " "); + } + System.out.println(); + } + System.out.println(); + + } +} \ No newline at end of file From 58f240958629dbfc7ba34cd4154e67bc63711fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B5=9C=EC=A7=84=EC=9A=B0?= Date: Sun, 30 Aug 2026 13:06:08 +0900 Subject: [PATCH 4/5] =?UTF-8?q?week8/=ED=91=9C=20=ED=8E=B8=EC=A7=91/nonani?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Solution.java" | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 "src/week8/\355\221\234 \355\216\270\354\247\221/Solution.java" diff --git "a/src/week8/\355\221\234 \355\216\270\354\247\221/Solution.java" "b/src/week8/\355\221\234 \355\216\270\354\247\221/Solution.java" new file mode 100644 index 0000000..6aee4f9 --- /dev/null +++ "b/src/week8/\355\221\234 \355\216\270\354\247\221/Solution.java" @@ -0,0 +1,131 @@ +/* +## ✏️ [프로그래머스] 표 편집 +📶 문제 난이도 +Lv. 3 + +🔗 문제 링크 +https://school.programmers.co.kr/learn/courses/30/lessons/81303 + +⏱️ 풀이 시간 +50분 + +✅ 풀이 근거 +생 구현 문제였다. +그런데 삭제 내역을 스택으로 관리하면 보다 컨트롤 z하기 쉬울 것 같아서 이건 스택으로 관리해야겠따고 생각했따. +*/ + +import java.util.*; + +class Node { + int index; + int prev; + int next; + + Node(int index, int prev, int next) { + this.index = index; + this.prev = prev; + this.next = next; + } +} + +class Solution { + + + public String solution(int n, int k, String[] cmds) { + + Node[] nodes = new Node[n]; + + // 연결 리스트 구성 + for (int i = 0; i < n; i++) { + int prev = i - 1; + int next = i + 1; + + if (i == n - 1) + next = -1; + + nodes[i] = new Node(i, prev, next); + } + + Stack stack = new Stack<>(); // 지워진 애들 + int cur = k; + + for (String cmd : cmds) { + char oper = cmd.charAt(0); + + // 위로 이동 + if (oper == 'U') { + + int count = Integer.parseInt(cmd.substring(2)); + + while (count-- > 0) { + cur = nodes[cur].prev; + } + } + + // 아래로 이동 + else if (oper == 'D') { + + int count = Integer.parseInt(cmd.substring(2)); + + while (count-- > 0) { + cur = nodes[cur].next; + } + } + + // 삭제 + else if (oper == 'C') { + + int prev = nodes[cur].prev; + int next = nodes[cur].next; + + stack.push(new Node(cur, prev, next)); + + // 앞 노드와 뒤 노드를 서로 연결 + if (prev != -1) { + nodes[prev].next = next; + } + + if (next != -1) { + nodes[next].prev = prev; + } + + // 커서 이동 + if (next != -1) // 다음 행이 있으면 다음 행 + cur = next; + else // 마지막 행을 삭제했다면 이전 행 + cur = prev; + + } + + // 복구 + else if (oper == 'Z') { + + Node deleted = stack.pop(); + + int index = deleted.index; + int prev = deleted.prev; + int next = deleted.next; + + // 삭제됐던 노드의 연결 정보 복구 + nodes[index].prev = prev; + nodes[index].next = next; + + if (prev != -1) + nodes[prev].next = index; + if (next != -1) + nodes[next].prev = index; + + } + } + + char[] answer = new char[n]; + Arrays.fill(answer, 'O'); + + // 아직 stack에 남아있는 노드 = 최종적으로 삭제된 노드 + while (!stack.isEmpty()) { + answer[stack.pop().index] = 'X'; + } + + return new String(answer); + } +} \ No newline at end of file From f941d7a48c2a0b14c2f5d5aa680132075d3bbd63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B5=9C=EC=A7=84=EC=9A=B0?= Date: Sun, 30 Aug 2026 13:06:15 +0900 Subject: [PATCH 5/5] =?UTF-8?q?week8/=ED=95=A0=EC=9D=B8=ED=96=89=EC=82=AC/?= =?UTF-8?q?nonani?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Solution.java" | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 "src/week8/\355\225\240\354\235\270\355\226\211\354\202\254/Solution.java" diff --git "a/src/week8/\355\225\240\354\235\270\355\226\211\354\202\254/Solution.java" "b/src/week8/\355\225\240\354\235\270\355\226\211\354\202\254/Solution.java" new file mode 100644 index 0000000..ab0e2f0 --- /dev/null +++ "b/src/week8/\355\225\240\354\235\270\355\226\211\354\202\254/Solution.java" @@ -0,0 +1,85 @@ +/* +## ✏️ [프로그래머스] 할인 행사 + +📶 문제 난이도 +Lv. 2 + +🔗 문제 링크 +https://school.programmers.co.kr/learn/courses/30/lessons/131127 + +⏱️ 풀이 시간 +30분 + +✅ 풀이 근거 +단순하게 생각하면 1~100,000일 동안 want의 길이 일 연속으로 되는지 확인하면 되어서 +최악의 경우 100,000 * 10이다. +그러나 슬라이딩 윈도우를 적용해서 want의 길이 만큼의 크기의 윈도우를 한칸 옮길 때마다 제일 왼쪽 과일은 빼고 새로 추가되는 오른쪽 과일은 포함시키는 식으로 하면 100,000만으로 가능하다. +*/ + + +import java.util.*; + +class Solution { + public int solution(String[] want, int[] number, String[] discount) { + int answer = 0; + int N = 0; + for (int w : number) + N += w; + HashMap map = new HashMap<>(); + for (int i = 0; i < want.length; i++) { + // 원하는 물품과 원하는 수량을 Map에 저장해둔다. + map.put(want[i], number[i]); + } + + // 우선 0일에 가입한 시나리오 + for (int i = 0; i < N; i++) { + if (map.get(discount[i]) == null) continue; + map.put(discount[i], map.get(discount[i]) - 1); + } + + // 이때 몇개나 할인 받을 수 있는지 체크 + int cnt = 0; + for (String key : map.keySet()) { + if (map.get(key) == 0) cnt++; + } + + if (cnt == want.length) answer++; + + // for(String k : want) { + // System.out.println(k +" : " + map.get(k) +" | "); + // } + // System.out.println(cnt+"\n"); + + + for (int i = N; i < discount.length; i++) { + + // 슬라이딩 윈도우 + String leftFruit = discount[i - N]; + String rightFruit = discount[i]; + + // 사고 싶은거에 포함 됐던거면 + if (map.get(leftFruit) != null) { + if (map.get(leftFruit) == 0) cnt--; + map.put(leftFruit, map.get(leftFruit) + 1); + if (map.get(leftFruit) == 0) cnt++; + + } + + if (map.get(rightFruit) != null) { + if (map.get(rightFruit) == 0) cnt--; + map.put(rightFruit, map.get(rightFruit) - 1); + if (map.get(rightFruit) == 0) cnt++; + } + + + // for(String k : want) { + // System.out.println(k +" : " + map.get(k) +" | "); + // } + // System.out.println(cnt+"\n"); + + if (cnt == want.length) answer++; + + } + return answer; + } +} \ No newline at end of file