From 0aab9394f3e155a6f8339cda5f23dcd02b2a1afd Mon Sep 17 00:00:00 2001 From: izzy80 <115052929+izzy80@users.noreply.github.com> Date: Tue, 21 Jan 2025 23:07:20 +0900 Subject: [PATCH 1/9] =?UTF-8?q?=E2=9C=A8=20feat:=20BOJ=5F1283=5F=EB=8B=A8?= =?UTF-8?q?=EC=B6=95=ED=82=A4=5F=EC=A7=80=EC=A0=95=5F=EC=95=8C=EA=B3=A0?= =?UTF-8?q?=EB=A6=AC=EC=A6=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...355\202\244_\354\247\200\354\240\225.java" | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 "Izzy/_250121/BOJ_1283_\353\213\250\354\266\225\355\202\244_\354\247\200\354\240\225.java" diff --git "a/Izzy/_250121/BOJ_1283_\353\213\250\354\266\225\355\202\244_\354\247\200\354\240\225.java" "b/Izzy/_250121/BOJ_1283_\353\213\250\354\266\225\355\202\244_\354\247\200\354\240\225.java" new file mode 100644 index 0000000..ef19925 --- /dev/null +++ "b/Izzy/_250121/BOJ_1283_\353\213\250\354\266\225\355\202\244_\354\247\200\354\240\225.java" @@ -0,0 +1,84 @@ + +''' + * 문제 링크: https://www.acmicpc.net/problem/1283 + * 메모리: 11576 KB + * 시간: 68 ms + * 시간 복잡도: O(N*L) + * 공간 복잡도: O(N) + + +1. N으로 for문으로 돌음 +2. 단어의 첫번째 알파벳을 사용했는지 안 했는데 탐색 +3. 2번의 경우를 다 돌았는데도 찾지 못 하면 각각의 알파벳을 탐색 +3. StringBuilder로 출력 처리 +''' + +package boj; + +import java.util.*; +import java.io.*; + +/** + * 1. 왼쪽부터 살핌. 단어의 첫 글자를 단축키로 지정 + * 1-1. 단어의 첫 글자가 이미 선택-> 그 다음 단어의 첫 글자 선택 + * 1-2. 1-1에도 안 된다. 다시 맨 왼쪽의 단어로 돌아와서 이미 선택된 것을 제외하고 + * 선택되지 않은 알파벳을 선택한다. + * 2. 대소문자 구분 안 함 + * + */ +public class BOJ_1283_단축키_지정 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + + int N = Integer.parseInt(br.readLine()); + boolean[] alpha = new boolean[26]; //알파벳이 선택되었는지 + + String[][] word = new String[N][5]; + for(int i=0; i < N; i++){//옵션 + String s = br.readLine(); + String[] tmp = s.split(" "); + + boolean flag = false; //이미 다 첫 번째 단어를 사용했는지 + for(int j = 0; j < tmp.length; j++){ //단어의 갯수만큼 돈다 + word[i][j] = tmp[j]; + if(!flag && !alpha[Character.toLowerCase(tmp[j].charAt(0))-'a']){ + //사용되지 않은 단어 + word[i][j] = "["+tmp[j].charAt(0)+"]"+tmp[j].substring(1,tmp[j].length()); + alpha[Character.toLowerCase(tmp[j].charAt(0))-'a'] = true; + flag = true; + } + } +// System.out.println(Arrays.deepToString(word)); + + if(!flag){ + //true가 아니라는 것은 첫 번째 단어의 첫번째 알파벳들이 이미 다 선택됨 + outer : for(int j = 0; j < tmp.length; j++){ + for(int k= 0 ; k < tmp[j].length(); k++){ + char c = tmp[j].charAt(k); + char lc = Character.toLowerCase(c); + if(!alpha[lc-'a']){ + //사용 안 됨 + word[i][j] = tmp[j].substring(0, k)+"["+c+"]"+tmp[j].substring(k+1, tmp[j].length()); + alpha[lc-'a'] = true; + break outer; + } + } + } + } + } +// System.out.println(Arrays.deepToString(word)); + //출력 + StringBuilder sb = new StringBuilder(); + + for(int i =0 ; i < N; i++){ + for(int j=0; j < 5; j++){ + if(word[i][j] == null) continue; + sb.append(word[i][j]).append(" "); + } + sb.append("\n"); + } + + System.out.println(sb.toString()); + } +} From 730458577dc722df569294611d985a14370669dd Mon Sep 17 00:00:00 2001 From: izzy80 <115052929+izzy80@users.noreply.github.com> Date: Wed, 22 Jan 2025 22:37:46 +0900 Subject: [PATCH 2/9] =?UTF-8?q?=E2=9C=A8feat:BOJ=5F1522=5F=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=EC=97=B4=5F=EA=B5=90=ED=99=98=20=EC=95=8C=EA=B3=A0?= =?UTF-8?q?=EB=A6=AC=EC=A6=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...354\227\264_\352\265\220\355\231\230.java" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 "Izzy/_250122/BOJ_1522_\353\254\270\354\236\220\354\227\264_\352\265\220\355\231\230.java" diff --git "a/Izzy/_250122/BOJ_1522_\353\254\270\354\236\220\354\227\264_\352\265\220\355\231\230.java" "b/Izzy/_250122/BOJ_1522_\353\254\270\354\236\220\354\227\264_\352\265\220\355\231\230.java" new file mode 100644 index 0000000..b90e4b1 --- /dev/null +++ "b/Izzy/_250122/BOJ_1522_\353\254\270\354\236\220\354\227\264_\352\265\220\355\231\230.java" @@ -0,0 +1,49 @@ + +''' + * 문제 링크: https://www.acmicpc.net/problem/1522 + * 메모리: 11496 KB + * 시간: 68 ms + * 시간 복잡도: O(N²) + * 공간 복잡도: O(N) + + +1. 주어진 단어 안의 a의 갯수 구하기 +2. 단어를 a의 갯수만큼 쪼개서 for문을 돌음 + 2-1. 내부에 b의 갯수를 센다. + 2-2. 가장 작은 b의 갯수를 반환 +''' + +package boj; + +import java.util.*; +import java.io.*; + +public class BOJ_1522_문자열_교환 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + String str = br.readLine(); + + int aCnt = 0; + int answer = Integer.MAX_VALUE; + + //1. 단어 안의 a의 갯수 구하기 + for(int i = 0; i < str.length(); i++){ + char c = str.charAt(i); + if(c == 'a') aCnt++; + } + + //2 str의 내부의 a의 갯수만큼 자릿수를 자른다. + //슬라이딩 윈도우를 사용해서 그 자릿수 내부에 b의 개수가 몇 개인지 센다. + for(int i=0; i < str.length(); i++){ + int bCnt = 0; + for(int j=i; j Date: Tue, 4 Feb 2025 21:24:55 +0900 Subject: [PATCH 3/9] =?UTF-8?q?=F0=9F=9A=9A=20rename:=ED=8F=B4=EB=8D=94?= =?UTF-8?q?=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...213\250\354\266\225\355\202\244_\354\247\200\354\240\225.java" | 0 ...254\270\354\236\220\354\227\264_\352\265\220\355\231\230.java" | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename "Izzy/_250121/BOJ_1283_\353\213\250\354\266\225\355\202\244_\354\247\200\354\240\225.java" => "Izzy/1\354\233\224/_250121/BOJ_1283_\353\213\250\354\266\225\355\202\244_\354\247\200\354\240\225.java" (100%) rename "Izzy/_250122/BOJ_1522_\353\254\270\354\236\220\354\227\264_\352\265\220\355\231\230.java" => "Izzy/1\354\233\224/_250122/BOJ_1522_\353\254\270\354\236\220\354\227\264_\352\265\220\355\231\230.java" (100%) diff --git "a/Izzy/_250121/BOJ_1283_\353\213\250\354\266\225\355\202\244_\354\247\200\354\240\225.java" "b/Izzy/1\354\233\224/_250121/BOJ_1283_\353\213\250\354\266\225\355\202\244_\354\247\200\354\240\225.java" similarity index 100% rename from "Izzy/_250121/BOJ_1283_\353\213\250\354\266\225\355\202\244_\354\247\200\354\240\225.java" rename to "Izzy/1\354\233\224/_250121/BOJ_1283_\353\213\250\354\266\225\355\202\244_\354\247\200\354\240\225.java" diff --git "a/Izzy/_250122/BOJ_1522_\353\254\270\354\236\220\354\227\264_\352\265\220\355\231\230.java" "b/Izzy/1\354\233\224/_250122/BOJ_1522_\353\254\270\354\236\220\354\227\264_\352\265\220\355\231\230.java" similarity index 100% rename from "Izzy/_250122/BOJ_1522_\353\254\270\354\236\220\354\227\264_\352\265\220\355\231\230.java" rename to "Izzy/1\354\233\224/_250122/BOJ_1522_\353\254\270\354\236\220\354\227\264_\352\265\220\355\231\230.java" From ab5916c777aa4929f981590a715a99523f35f118 Mon Sep 17 00:00:00 2001 From: izzy80 <115052929+izzy80@users.noreply.github.com> Date: Tue, 4 Feb 2025 21:25:26 +0900 Subject: [PATCH 4/9] =?UTF-8?q?=E2=9C=A8=20feat:BOJ=5F2573=5F=EB=B9=99?= =?UTF-8?q?=EC=82=B0=20=EC=95=8C=EA=B3=A0=EB=A6=AC=EC=A6=98=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BOJ_2573_\353\271\231\354\202\260.java" | 152 ++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 "Izzy/2\354\233\224/_250204/BOJ_2573_\353\271\231\354\202\260.java" diff --git "a/Izzy/2\354\233\224/_250204/BOJ_2573_\353\271\231\354\202\260.java" "b/Izzy/2\354\233\224/_250204/BOJ_2573_\353\271\231\354\202\260.java" new file mode 100644 index 0000000..2624344 --- /dev/null +++ "b/Izzy/2\354\233\224/_250204/BOJ_2573_\353\271\231\354\202\260.java" @@ -0,0 +1,152 @@ +package bfsdfs; + +import java.util.*; +import java.io.*; +import java.util.LinkedList; + +/** + * 두 덩어리 이상 분리되지 않으면 0 출력 + * 두 덩어리 이상으로 분리되는 최초의 시간 + * 주변에 0으로 둘러쌓여 있으면 그만큼 빙산이 줄어들음 + */ + +''' + * 문제 링크: https://www.acmicpc.net/problem/2573 + * 메모리: 192984 KB + * 시간: 536 ms + * 시간 복잡도: O(NM) + * 공간 복잡도: O(NM) + +1. 빙산 조각을 셈 + 1-1. 빙산 조각이 2개 이상이면 멈추게 함 + 1-2. 빙산 조각이 0이면 0으로 출력하게 한다. +2. 빙산 주변의 0의 갯수를 파악해서 배열에 저장 +3. 빙산을 녹임 + 3-1. 빼서 음의 정수가 나오면 0으로 초기화하기. +4. 시간+1을 함 + +''' +public class BOJ_2573_빙산 { + static int N,M; + static int[][] ices; + static int[][] zero; //주변에 0의 개수 + static int[] mover = {0,0,-1,1}; + static int[] movec = {-1,1,0,0}; + static boolean[][] visited; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); //행 + M = Integer.parseInt(st.nextToken()); //열 + + ices = new int[N][M]; + + for(int i=0; i < N; i++){ + st = new StringTokenizer(br.readLine()); + for(int j=0; j < M; j++){ + ices[i][j] = Integer.parseInt(st.nextToken()); + } + } +// System.out.println(Arrays.deepToString(ices)); + + //solve + int time = 0; + while(true){ + int ice_cnt = check_ice_cnt(); +// System.out.println(ice_cnt); + if(ice_cnt>= 2){ + //만약 빙산의 갯수가 2개 이상이면 + System.out.println(time); +// System.out.println("빙산의 갯수 2개 이상"); + break; + } + else if(ice_cnt == 0){ + //빙산의 갯수가 0이면 + System.out.println(0); +// System.out.println("빙산의 갯수 0개"); + break; + } + + //빙산이 작아짐 + find_near_zero(); + + //빙산 녹게함 + ice_melt(); + + time++; //시간 지남 + } + + } + + public static void ice_melt(){ + for(int i=0; i < N; i++){ + for(int j=0; j < M; j++){ + ices[i][j] -= zero[i][j]; + if(ices[i][j] < 0 ) ices[i][j] = 0; + } + + } + } + + public static void find_near_zero(){ + zero = new int[N][M]; + for(int i=0; i < N; i++){ + for(int j=0; j < M; j++){ + if(ices[i][j] != 0){ + int zero_cnt = 0; + for(int m=0; m < 4; m++){ + int nr = i + mover[m]; + int nc = j + movec[m]; + if(nr < 0 || nr >= N || nc <0 || nc >= M) continue; + if(ices[nr][nc] == 0) zero_cnt++; + } + zero[i][j] = zero_cnt; + } + } + + } + } + + public static int check_ice_cnt(){ + visited = new boolean[N][M]; + int ice_cnt = 0; + for(int i=0; i < N; i++){ + for(int j=0; j < M; j++){ + if(ices[i][j] != 0 && !visited[i][j]){ + //방문하지 않았고, 빙하가 있음 + bfs(i,j); + ice_cnt++; + } + } + } + + return ice_cnt; //빙산의 갯수 + } + + public static void bfs(int r, int c){ + Queue q = new LinkedList<>(); + q.add(new int[]{r,c}); + visited[r][c] = true; + + while(!q.isEmpty()){ + int[] now = q.poll(); + int cr = now[0]; + int cc = now[1]; + + for(int m=0; m< 4; m++){ + int nr = cr + mover[m]; + int nc = cc + movec[m]; + + if(nr < 0 || nr >= N || nc <0 || nc >= M) continue; + if(visited[nr][nc]) continue; + if(ices[nr][nc] == 0) continue; + q.add(new int[]{nr, nc}); + visited[nr][nc] = true; + } + + } + + } +} From 9e1957d0acf3176a7f8f39f94667a3bdd68ed9c6 Mon Sep 17 00:00:00 2001 From: izzy80 <115052929+izzy80@users.noreply.github.com> Date: Wed, 5 Feb 2025 23:51:20 +0900 Subject: [PATCH 5/9] =?UTF-8?q?=E2=9C=A8=20feat:BOJ=5F9205=5F=EB=A7=A5?= =?UTF-8?q?=EC=A3=BC=5F=EB=A7=88=EC=8B=9C=EB=A9=B4=EC=84=9C=5F=EA=B1=B8?= =?UTF-8?q?=EC=96=B4=EA=B0=80=EA=B8=B0=20=EC=95=8C=EA=B3=A0=EB=A6=AC?= =?UTF-8?q?=EC=A6=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\354\226\264\352\260\200\352\270\260.java" | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 "Izzy/2\354\233\224/_250205/BOJ_9205_\353\247\245\354\243\274_\353\247\210\354\213\234\353\251\264\354\204\234_\352\261\270\354\226\264\352\260\200\352\270\260.java" diff --git "a/Izzy/2\354\233\224/_250205/BOJ_9205_\353\247\245\354\243\274_\353\247\210\354\213\234\353\251\264\354\204\234_\352\261\270\354\226\264\352\260\200\352\270\260.java" "b/Izzy/2\354\233\224/_250205/BOJ_9205_\353\247\245\354\243\274_\353\247\210\354\213\234\353\251\264\354\204\234_\352\261\270\354\226\264\352\260\200\352\270\260.java" new file mode 100644 index 0000000..b96a89b --- /dev/null +++ "b/Izzy/2\354\233\224/_250205/BOJ_9205_\353\247\245\354\243\274_\353\247\210\354\213\234\353\251\264\354\204\234_\352\261\270\354\226\264\352\260\200\352\270\260.java" @@ -0,0 +1,113 @@ +package bfsdfs; + +import java.util.*; +import java.io.*; + +/** + * 문제 요약 + * 송도(상근이네 집) -> 펜타포트 락 페스티벌 + * 맥주 한 박스(20개) 들고 출발 + * 50m에 한 병씩 마신다. 50m 가려면 직전에 한 병 마심 + * 편의점에서 빈 병은 버리고 새 맥주 병 살 수 있음. 단 상자의 맥주는 20병을 넘을 수 없음 + * + * 행복하게 페스티벌에 갈 수 있다면 "happy" + * 중간에 맥주가 바닥나면 "sad" + */ + +/** + * 그냥 정점, 간선이 있는 그래프 형태라고 생각하기 + * 편의점, 맥주라는 조건이 있지만 사실 이 부분은 큰 의미가 없다 + * 도착지 외에 편의점을 경유하고, 편의점에 들리기만 하면 병 20개를 채울 수 있음 + * 병의 갯수와 상관없이 현재 위치에서 다음위치까지 맨해튼 거리가 1000이하이면 항상 이동 가능 + * 1000인 이유는 50m * 20병 = 1000 이기 때문 + */ + +''' + * 문제 링크: https://www.acmicpc.net/problem/9205 + * 메모리: 12656 KB + * 시간: 88 ms + * 시간 복잡도: O(TN) + * 공간 복잡도: O(N) + +1. place에 위치 집어넣기 +2. BFS 돌리면서 탐색 + 2-1. 맨해튼 거리가 1000이하이면 이동 가능 + 2-2. 방문한 곳은 이동 금지 + 2-3. 도착지에 도착하면 "happy" 실패하면 "sad" + +''' +public class BOJ_9205_맥주_마시면서_걸어가기 { + static int convenience_cnt; + static Point[] places; + static String answer; + static int MIN_DISTANCE = -32768; + static int MAX_DISTANCE = 32768; + static boolean[] visited; + + static class Point { + int r; + int c; + + public Point(int r, int c) { + this.r = r; + this.c = c; + } + } + + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int T = Integer.parseInt(br.readLine()); + StringTokenizer st; + for(int tc = 0; tc < T ; tc++){ + answer = "sad"; + //input값 입력 + convenience_cnt = Integer.parseInt(br.readLine()); + places = new Point[convenience_cnt+2]; + + for(int i=0; i < convenience_cnt+2; i++){ + st = new StringTokenizer(br.readLine()); + int r = Integer.parseInt(st.nextToken()); + int c = Integer.parseInt(st.nextToken()); + places[i] = new Point(r,c); + } + //solve + BFS(places[0].r, places[0].c); + + //print + System.out.println(answer); + } + } + //함수 + public static void BFS(int r, int c){ + visited = new boolean[convenience_cnt+2]; + Queue q = new LinkedList<>(); + q.add(new Point(r,c)); + visited[0] = true; //출발지 등록 + + while(!q.isEmpty()){ + Point now = q.poll(); + + for(int i=1; i < convenience_cnt+2; i++){ + if(visited[i]) continue; //방문했다면 + if(!passable(now, places[i])) continue;//멘하튼 거리 내에 없으면 + if(i == convenience_cnt+1) { + answer = "happy"; + return; + } + q.add(new Point(places[i].r,places[i].c)); + visited[i] = true; + } + + } + + } + static public boolean passable(Point a, Point b) { + int distance = Math.abs(a.r - b.r) + Math.abs(a.c - b.c); + if (distance <= 1000) { + return true; + } else { + return false; + } + } +} From 5a8076f7d0ac8c624887c86ce4f4ce03e8ff0014 Mon Sep 17 00:00:00 2001 From: izzy80 <115052929+izzy80@users.noreply.github.com> Date: Wed, 5 Feb 2025 23:51:44 +0900 Subject: [PATCH 6/9] =?UTF-8?q?=E2=9C=A8=20feat:BOJ=5F14503=5F=EB=A1=9C?= =?UTF-8?q?=EB=B4=87=EC=B2=AD=EC=86=8C=EA=B8=B0=20=EC=95=8C=EA=B3=A0?= =?UTF-8?q?=EB=A6=AC=EC=A6=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\354\262\255\354\206\214\352\270\260.java" | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 "Izzy/2\354\233\224/_250205/BOJ_14503_\353\241\234\353\264\207\354\262\255\354\206\214\352\270\260.java" diff --git "a/Izzy/2\354\233\224/_250205/BOJ_14503_\353\241\234\353\264\207\354\262\255\354\206\214\352\270\260.java" "b/Izzy/2\354\233\224/_250205/BOJ_14503_\353\241\234\353\264\207\354\262\255\354\206\214\352\270\260.java" new file mode 100644 index 0000000..6c163c3 --- /dev/null +++ "b/Izzy/2\354\233\224/_250205/BOJ_14503_\353\241\234\353\264\207\354\262\255\354\206\214\352\270\260.java" @@ -0,0 +1,102 @@ +package bfsdfs; + +import java.util.*; +import java.io.*; + +/** + * 로봇청소기의 방향 : 동서남북 + * + * 1. 현재 칸 청소 X -> 청소 + * 2. 다음 칸 이동 + * 현재 칸 주변 4칸 중 청소되지 않은 빈 칸이 + * 2-1. 없는 경우 + * 바라보는 방향 유지 + * 2-1-1. 벽이라 후진X -> 작동 멈춤 + * 2-1-2. 후진 가능 -> 한 칸 후진하고 1번으로 돌아감 + * + * 2-2. 있는 경우 + * 2-2-1. 반시계 방향으로 90도 회전 -> (방향 이동) + * - 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈칸이라면 한 칸 전진 + * - 1번으로 돌아감 + * + * 0 북 1 동 2 남 3 서 + * 청소되지 않은 빈 칸 0 + * 벽 1 + * + * 청소하는 칸의 개수 + */ +''' + * 문제 링크: https://www.acmicpc.net/problem/9205 + * 메모리: 11864 KB + * 시간: 72 ms + * 시간 복잡도: O(NM) + * 공간 복잡도: O(NM) +''' +public class BOJ_14503_로봇청소기 { + static int N, M; + static int[][] map; + static int answer = 1; //처음 빈칸은 항상 청소되지 않음 + static int[] mover = {-1,0,1,0}; + static int[] movec = {0,1,0,-1}; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + + //처음 값 초기화 + st = new StringTokenizer(br.readLine()); + int startr = Integer.parseInt(st.nextToken()); + int startc = Integer.parseInt(st.nextToken()); + int startd = Integer.parseInt(st.nextToken());//초기 방향 + + //지도 초기화 + map = new int[N][M]; + for(int i=0; i < N; i++){ + st = new StringTokenizer(br.readLine()); + for(int j=0; j < M; j++){ + map[i][j] = Integer.parseInt(st.nextToken()); + } + } + + //solve + simul(startr, startc, startd); + + //print + System.out.println(answer); + } + + public static void simul(int r, int c, int d) { + //1. 현재 칸 청소 + map[r][c] = -1; + + //2. 주변 탐색 + for (int m = 0; m < 4; m++) { + d = (d + 3) % 4; // 반시계로 90도 이동 + + int nr = r + mover[d]; + int nc = c + movec[d]; + + if (inRange(nr, nc) &&map[nr][nc] == 0) { + answer++; + simul(nr, nc, d); + return; + } + } + + //여기까지 왔다는 것은 위에서 이동할 곳을 찾지 못 했다는 것 + + int bd = (d + 2) % 4; //반대방향으로 후진 + int br = r + mover[bd]; + int bc = c + movec[bd]; + if (inRange(br, bc) && map[br][bc] != 1){ + simul(br, bc, d); //방향은 그대로 유지 + } + } + + public static boolean inRange(int r, int c){ + return (0 <= r && r < N && 0 <= c && c < M); + } +} From 96364f331483af41b8c2dfd05221cc3ca372e9cd Mon Sep 17 00:00:00 2001 From: izzy80 <115052929+izzy80@users.noreply.github.com> Date: Tue, 11 Feb 2025 21:20:22 +0900 Subject: [PATCH 7/9] =?UTF-8?q?=E2=9C=A8=20feat:BOJ=5F9019=5FDSLR=20?= =?UTF-8?q?=EC=95=8C=EA=B3=A0=EB=A6=AC=EC=A6=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2\354\233\224/_250211/BOJ_9019_DSLR.java" | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 "Izzy/2\354\233\224/_250211/BOJ_9019_DSLR.java" diff --git "a/Izzy/2\354\233\224/_250211/BOJ_9019_DSLR.java" "b/Izzy/2\354\233\224/_250211/BOJ_9019_DSLR.java" new file mode 100644 index 0000000..77ef430 --- /dev/null +++ "b/Izzy/2\354\233\224/_250211/BOJ_9019_DSLR.java" @@ -0,0 +1,103 @@ +package bfsdfs; + +import java.util.*; +import java.io.*; + +/** + * D : n을 두 배로 바꾼다. 결과값이 9999보다 큰 경우 10000으로 나눈 나머지로 취한다. + * S : n-1, n이 0이면 9999가 저장 + * L : n의 각 자릿수를 왼편으로 회전시켜서 저장 + * d2,d3,d4,d1 + * R : n의 각 자릿수를 오른편으로 회전시켜서 저장 + * d4,d1,d2,d3 + * + * A를 B로 바꾸는 최소한의 명령어를 생성 + * 자릿수에 0이 포함되는 경우를 주의해라 + * + */ + +''' + * 문제 링크: https://www.acmicpc.net/problem/9019 + * 메모리: 298336 KB + * 시간: 3476 ms + * 시간 복잡도: O(VE) + * 공간 복잡도: O(V) +''' + +public class BOJ_9019_DSLR { + static int B; + static final int MAX = 10_000; + static boolean[] visited; + static String answer = ""; + + static class Node { + int number; + String str; + + public Node(int number, String str) { + this.number = number; + this.str = str; + } + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int T = Integer.parseInt(br.readLine()); + + StringTokenizer st; + for(int tc = 0; tc < T ; tc++){ + st = new StringTokenizer(br.readLine()); + int A = Integer.parseInt(st.nextToken()); + B = Integer.parseInt(st.nextToken()); + + bfs(A); + + System.out.println(answer); + } + } + + public static void bfs(int A){ + Queue q = new ArrayDeque<>(); + visited = new boolean[MAX+1]; + + q.add(new Node(A, "")); + visited[A] = true; + + while(!q.isEmpty()){ + Node n = q.poll(); + int now = n.number; + String str = n.str; + + if(now == B) { + answer = str; + return; + } + + int D = (2 * now) % 10000; + int S = now == 0 ? 9999 : now - 1; + int L = (now % 1000) * 10 + now / 1000; + int R = (now % 10) * 1000 + now / 10; + + if (!visited[D]) { + q.add(new Node(D, str+"D")); + visited[D] = true; + } + + if (!visited[S]) { + q.add(new Node(S, str+"S")); + visited[S] = true; + } + + if (!visited[L]) { + q.add(new Node(L, str+"L")); + visited[L] = true; + } + + if (!visited[R]) { + q.add(new Node(R, str+"R")); + visited[R] = true; + } + } + + } +} From 78a599497226cb9a137e3ea96b26ab6ea7caafd9 Mon Sep 17 00:00:00 2001 From: izzy80 <115052929+izzy80@users.noreply.github.com> Date: Mon, 17 Feb 2025 18:58:33 +0900 Subject: [PATCH 8/9] =?UTF-8?q?=E2=9C=A8=20feat=20:=20BOJ=5F11559=5FPuyo?= =?UTF-8?q?=5FPuyo=20=EC=95=8C=EA=B3=A0=EB=A6=AC=EC=A6=98=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_250217/BOJ_11559_Puyo_Puyo.java" | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 "Izzy/2\354\233\224/_250217/BOJ_11559_Puyo_Puyo.java" diff --git "a/Izzy/2\354\233\224/_250217/BOJ_11559_Puyo_Puyo.java" "b/Izzy/2\354\233\224/_250217/BOJ_11559_Puyo_Puyo.java" new file mode 100644 index 0000000..bfd6c12 --- /dev/null +++ "b/Izzy/2\354\233\224/_250217/BOJ_11559_Puyo_Puyo.java" @@ -0,0 +1,125 @@ +package bfsdfs; + +import java.util.*; +import java.io.*; + +/* +. : 빈공간 +R : 빨강 / G : 초록 / B : 파랑 / P : 보라 / Y : 노랑 +입력으로 주어진 것은 뿌요들이 전부 아래로 떨어진 뒤의 상황 + +1. for문 돌면서 색이 들어간 칸을 찾음 +BFS돌려서 4개 이상 터지는 칸을 bomb에 집어넣음 +2. bomb의 사이즈가 4개 이상이면 색을 .으로 바꿈 +3. 한 depth가 돌아가면 부셔진 것들이 있으니, 아래로 이동시켜주기 + */ + +''' + * 문제 링크: https://www.acmicpc.net/problem/11559 + * 메모리: 11864 KB + * 시간: 68 ms + * 시간 복잡도: O(NM) + * 공간 복잡도: O(NM) +''' +public class BOJ_11559_Puyo_Puyo { + static final int N = 12; + static final int M = 6; + static char[][] map = new char[N][M]; + static int[] mover = {0,0,-1,1}; + static int[] movec = {-1,1,0,0}; + static Queue bomb; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + for(int i=0; i < N; i++){ + String str = br.readLine(); + for(int j=0; j < M; j++){ + map[i][j] = str.charAt(j); + } + } + //solve + int answer = 0; + while(true){ + boolean flag = false; + for(int i=0; i < N; i++){ + for(int j=0; j < M; j++){ + if(map[i][j] != '.') {//색이 있다면 + bfs(i, j, map[i][j]); + + if (bomb.size() >= 4) { + while(!bomb.isEmpty()){ + int[] tmp = bomb.poll(); + map[tmp[0]][tmp[1]] = '.'; + } + flag = true; + } + } + } + } + if(!flag) break; //더 이상 터질게 없음 + //내려주기 + moveDown(); + answer++; + } + + //print + System.out.println(answer); + } + + + + static public void moveDown(){ + //아래로 이동시켜주기 + + for(int j = 0; j < M; j++){ + Stack s = new Stack<>(); + for(int i=0; i < N; i++){ + if(map[i][j] != '.'){ + //stack에 넣고 초기화 + s.push(map[i][j]); + map[i][j] = '.'; + } + } + + if(s.size() != 0){ + for(int i = N-1; i >= 0 ; i--){ + if(s.isEmpty()) break; + char c = s.pop(); + map[i][j] = c; + } + } + } + + + } + + static public void bfs(int r, int c, char color){ + Queue q = new ArrayDeque<>(); + boolean[][] visited = new boolean[N][M]; + bomb = new ArrayDeque<>(); + + q.add(new int[]{r,c}); + bomb.add(new int[]{r,c}); + visited[r][c] = true; + + while(!q.isEmpty()){ + int[] tmp = q.poll(); + int cr = tmp[0]; + int cc = tmp[1]; + + + for(int m =0; m < 4; m++){ + int nr = cr + mover[m]; + int nc = cc + movec[m]; + + if(nr < 0 || nr >= N || nc < 0 || nc >= M) continue; + if(visited[nr][nc]) continue; + if(map[nr][nc] == color){ + visited[nr][nc] = true; + q.add(new int[]{nr,nc}); + bomb.add(new int[]{nr,nc}); + } + } + } + } +} From 058d2a8e9e7b9c01bcc0d04881dd9d26e32cbb12 Mon Sep 17 00:00:00 2001 From: izzy80 <115052929+izzy80@users.noreply.github.com> Date: Tue, 18 Feb 2025 16:38:24 +0900 Subject: [PATCH 9/9] =?UTF-8?q?=E2=9C=A8=20feat:BOJ=5F1726=5F=EB=A1=9C?= =?UTF-8?q?=EB=B4=87=20=EC=95=8C=EA=B3=A0=EB=A6=AC=EC=A6=98=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BOJ_1726_\353\241\234\353\264\207.java" | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 "Izzy/2\354\233\224/_250218/BOJ_1726_\353\241\234\353\264\207.java" diff --git "a/Izzy/2\354\233\224/_250218/BOJ_1726_\353\241\234\353\264\207.java" "b/Izzy/2\354\233\224/_250218/BOJ_1726_\353\241\234\353\264\207.java" new file mode 100644 index 0000000..96cea4e --- /dev/null +++ "b/Izzy/2\354\233\224/_250218/BOJ_1726_\353\241\234\353\264\207.java" @@ -0,0 +1,127 @@ +package bfsdfs; + +import java.util.*; +import java.io.*; + +/** + * 동(1), 서(2), 남(3), 북(4) + * 명령은 2가지 + * 1. Go k : k는 1,2,3 현재 향하고 있는 방향으로 k만큼 회전 + * 2. Turn dir : dir은 left 또는 right이며 각각 왼쪽, 오른쪽으로 90도 회전(오른쪽 회전, 왼쪽 회전, 회전x) + * + * + * 2번 명령 먼저 하고 그 이후 1번 명령을 내린다. + * + * 0 : 로봇 이동 가능 + * 1 : 로봇 이동 불가능 + * + * 원하는 방향으로 바라보도록 하는데 최소 몇 번의 명령이 필요한가? + */ + +''' + * 문제 링크: https://www.acmicpc.net/problem/1726 + * 메모리: 12372 KB + * 시간: 84 ms + * 시간 복잡도: O(NM) + * 공간 복잡도: O(NM) + * + * 1. 시작점에서 bfs 돌림 + * 2. 거리 1,2,3 이동시키기 + * 3. 방향 회전하기 +''' +public class BOJ_1726_로봇 { + static int N,M; + static int[][] map; + static boolean[][][] visited; + static int endR, endC, endD; + static int[] mover = {0,0,1,-1}; + static int[] movec = {1,-1,0,0}; + static int answer = 0; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + + map = new int[N][M]; + for(int i=0; i < N; i++){ + st = new StringTokenizer(br.readLine()); + for(int j=0; j < M; j++){ + map[i][j] = Integer.parseInt(st.nextToken()); + } + } + + //solve + st = new StringTokenizer(br.readLine()); + int startR = Integer.parseInt(st.nextToken())-1; + int startC = Integer.parseInt(st.nextToken())-1; + int startD = Integer.parseInt(st.nextToken())-1; + + st = new StringTokenizer(br.readLine()); + endR = Integer.parseInt(st.nextToken())-1; + endC = Integer.parseInt(st.nextToken())-1; + endD = Integer.parseInt(st.nextToken())-1; + + bfs(startR, startC, startD); + + //print + System.out.println(answer); + } + + public static void bfs(int r, int c, int dir){ + Queue q = new ArrayDeque<>(); + visited = new boolean[N][M][4]; //방향 4가지 + q.add(new int[]{r,c,dir, 0}); + visited[r][c][dir] = true; + + while(!q.isEmpty()){ + int[] tmp = q.poll(); + int cr = tmp[0]; + int cc = tmp[1]; + int cd = tmp[2]; + int cnt = tmp[3]; //명령 카운트 + + //도착지에 도착했으면 끝 + if(cr == endR && cc == endC && cd == endD){ + answer = cnt; + return; + } + + //이동하기 + for(int dist=1; dist <=3; dist++){ + int nr = cr + (dist*mover[cd]); + int nc = cc + (dist*movec[cd]); + if(nr < 0 || nr >= N || nc <0 || nc >= M) continue; + if(visited[nr][nc][cd]) continue; + if(map[nr][nc] == 1) break; + //한칸씩 이동하는 칸을 늘려가는 것 + //우리는 벽을 뛰어넘을 수 없으니 중간에 벽을 만나면 무조건 멈춰야 한다. + q.add(new int[]{nr,nc,cd,cnt+1}); + visited[nr][nc][cd] = true; + } + + //방향 바꾸기 + int left = 0, right = 0; + switch(cd){ + case 0 : left = 3; right = 2; break; + case 1 : left = 2; right = 3; break; + case 2 : left = 0; right = 1; break; + case 3 : left = 1; right = 0; break; + } + + if(!visited[cr][cc][left]){ + q.add(new int[]{cr,cc,left, cnt+1}); + visited[cr][cc][left] = true; + } + + if(!visited[cr][cc][right]){ + q.add(new int[]{cr,cc,right, cnt+1}); + visited[cr][cc][right] = true; + } + + + } + + } +}