From 66abef621d024727dc517ca5caeee0a4aa2d4b51 Mon Sep 17 00:00:00 2001 From: leelise Date: Mon, 2 Jun 2025 00:44:50 +0900 Subject: [PATCH 01/11] =?UTF-8?q?=E2=9C=A8=20=20Algorithm/Array:=20?= =?UTF-8?q?=EB=B0=B0=EC=97=B4=20=EB=AC=B8=EC=A0=9C=208=EA=B0=9C=20?= =?UTF-8?q?=ED=92=80=EC=9D=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Array/.gitkeep | 0 ...\354\210\230\354\204\270\352\270\260.java" | 30 ++++++++ ...\353\262\263\352\260\234\354\210\230.java" | 31 ++++++++ Array/11328-Strfry.java | 46 ++++++++++++ ...\353\260\251\353\260\260\354\240\225.java" | 46 ++++++++++++ ...\353\260\251\353\262\210\355\230\270.java" | 42 +++++++++++ ...\353\247\214\353\223\244\352\270\260.java" | 34 +++++++++ ...\354\235\230\352\260\234\354\210\230.java" | 34 +++++++++ ...\354\210\230\354\235\230\355\225\251.java" | 73 +++++++++++++++++++ Main.java | 46 ++++++++++++ main.java | 13 ---- workbook/0x02.md | 2 +- workbook/0x03.md | 2 +- workbook/0x04.md | 2 +- workbook/0x05.md | 2 +- workbook/0x06.md | 2 +- workbook/0x07.md | 2 +- workbook/0x08.md | 2 +- workbook/0x09.md | 2 +- workbook/0x0B.md | 2 +- workbook/0x0C.md | 2 +- workbook/0x0D.md | 2 +- workbook/0x0E.md | 2 +- workbook/0x0F.md | 2 +- workbook/0x10.md | 2 +- workbook/0x11.md | 2 +- workbook/0x12.md | 2 +- workbook/0x13.md | 2 +- workbook/0x14.md | 2 +- workbook/0x15.md | 2 +- workbook/0x16.md | 2 +- workbook/0x17.md | 2 +- workbook/0x18.md | 2 +- workbook/0x19.md | 2 +- workbook/0x1A.md | 2 +- workbook/0x1B.md | 2 +- workbook/0x1C.md | 2 +- workbook/0x1D.md | 2 +- workbook/0x1E.md | 2 +- workbook/0x1F.md | 2 +- 40 files changed, 411 insertions(+), 42 deletions(-) delete mode 100644 Array/.gitkeep create mode 100644 "Array/10807-\352\260\234\354\210\230\354\204\270\352\270\260.java" create mode 100644 "Array/10808-\354\225\214\355\214\214\353\262\263\352\260\234\354\210\230.java" create mode 100644 Array/11328-Strfry.java create mode 100644 "Array/13300-\353\260\251\353\260\260\354\240\225.java" create mode 100644 "Array/1475-\353\260\251\353\262\210\355\230\270.java" create mode 100644 "Array/1919-\354\225\240\353\204\210\352\267\270\353\236\250\353\247\214\353\223\244\352\270\260.java" create mode 100644 "Array/2577-\354\210\253\354\236\220\354\235\230\352\260\234\354\210\230.java" create mode 100644 "Array/3273-\353\221\220\354\210\230\354\235\230\355\225\251.java" create mode 100644 Main.java delete mode 100644 main.java diff --git a/Array/.gitkeep b/Array/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git "a/Array/10807-\352\260\234\354\210\230\354\204\270\352\270\260.java" "b/Array/10807-\352\260\234\354\210\230\354\204\270\352\270\260.java" new file mode 100644 index 0000000..c2c281f --- /dev/null +++ "b/Array/10807-\352\260\234\354\210\230\354\204\270\352\270\260.java" @@ -0,0 +1,30 @@ +package Array; + +import java.io.BufferedReader; +import java.io.InputStreamReader; + +public class Array10807개수세기 { + + public static void main(String[] args) throws Exception { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int max = Integer.parseInt(br.readLine()); + String[] input = br.readLine().split(" "); + int targetNum = Integer.parseInt(br.readLine()); + + int[] nums = new int[max]; + + for (int i = 0; i < max; i++) { + nums[i] = Integer.parseInt(input[i]); + } + + int count = 0; + for (int i = 0; i < max; i++) { + if (nums[i] == targetNum) { + count++; + } + } + System.out.println(count); + } + +} \ No newline at end of file diff --git "a/Array/10808-\354\225\214\355\214\214\353\262\263\352\260\234\354\210\230.java" "b/Array/10808-\354\225\214\355\214\214\353\262\263\352\260\234\354\210\230.java" new file mode 100644 index 0000000..800de36 --- /dev/null +++ "b/Array/10808-\354\225\214\355\214\214\353\262\263\352\260\234\354\210\230.java" @@ -0,0 +1,31 @@ +package Array; + +import java.io.BufferedReader; +import java.io.InputStreamReader; + +public class Array10808알파벳개수 { + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int code; + int[] alphabetCount = new int[26]; + + while (97 <= (code = br.read()) && code <= 122) { + alphabetCount[code - 97] += 1; + } + + br.close(); + + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < 26; i++) { + sb.append(alphabetCount[i]); + sb.append(" "); + } + + System.out.println(sb); + } +} + + diff --git a/Array/11328-Strfry.java b/Array/11328-Strfry.java new file mode 100644 index 0000000..c8a891e --- /dev/null +++ b/Array/11328-Strfry.java @@ -0,0 +1,46 @@ +package Array; + +import java.io.BufferedReader; +import java.io.InputStreamReader; + +public class Array11328Strfry { + + public static void main(String[] args) throws Exception { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int testCaseNum = Integer.parseInt(br.readLine()); + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < testCaseNum; i++) { + String[] targetNums = br.readLine().trim().split(" "); + String first = targetNums[0]; + String second = targetNums[1]; + + if (first.length() != second.length()) { + sb.append("Impossible\n"); + continue; + } + + int[] count = new int[26]; + for (int j = 0; j < first.length(); j++) { + count[first.charAt(j) - 'a']++; + count[second.charAt(j) - 'a']--; + } + + boolean isSame = true; + for (int c : count) { + if (c != 0) { + isSame = false; + break; + } + } + + if (isSame) { + sb.append("Possible\n"); + } else { + sb.append("Impossible\n"); + } + } + System.out.println(sb); + } +} \ No newline at end of file diff --git "a/Array/13300-\353\260\251\353\260\260\354\240\225.java" "b/Array/13300-\353\260\251\353\260\260\354\240\225.java" new file mode 100644 index 0000000..f4eeb55 --- /dev/null +++ "b/Array/13300-\353\260\251\353\260\260\354\240\225.java" @@ -0,0 +1,46 @@ +package Array; + +import java.io.BufferedReader; +import java.io.InputStreamReader; + +public class Array13300방배정 { + + public static void main(String[] args) throws Exception { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String[] condition = br.readLine().split(" "); + int totalPeople = Integer.parseInt(condition[0]); + int maxPeople = Integer.parseInt(condition[1]); + String[] studentInfo; + + int[] genderCollector = new int[totalPeople]; + int[] gradeCollector = new int[totalPeople]; + + int girl = 0; + int man = 0; + + for (int i = 0; i < totalPeople; i++) { + studentInfo = br.readLine().split(" "); + genderCollector[i] = Integer.parseInt(studentInfo[0]); + gradeCollector[i] = Integer.parseInt(studentInfo[1]); + } + + int roomCount = 0; + for(int i = 1; i <= 6; i++) { + for (int j = 0; j nums[i]) { + count += nums[i]*-1; + } else { + count += nums[i]; + } + } + } + System.out.println(count); + } +} \ No newline at end of file diff --git "a/Array/2577-\354\210\253\354\236\220\354\235\230\352\260\234\354\210\230.java" "b/Array/2577-\354\210\253\354\236\220\354\235\230\352\260\234\354\210\230.java" new file mode 100644 index 0000000..52e2d7e --- /dev/null +++ "b/Array/2577-\354\210\253\354\236\220\354\235\230\352\260\234\354\210\230.java" @@ -0,0 +1,34 @@ +package Array; + +import java.io.BufferedReader; +import java.io.InputStreamReader; + +public class Array2577숫자의개수 { + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int a = Integer.parseInt(br.readLine()); + int b = Integer.parseInt(br.readLine()); + int c = Integer.parseInt(br.readLine()); + br.close(); + + int result = a * b * c; + int[] count = new int[10]; + int remainder; + + while (result > 0) { + remainder = result % 10; + count[remainder]++; + result /= 10; + } + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < count.length; i++) { + sb.append(count[i]).append("\n"); + ; + } + System.out.println(sb); + } +} + + diff --git "a/Array/3273-\353\221\220\354\210\230\354\235\230\355\225\251.java" "b/Array/3273-\353\221\220\354\210\230\354\235\230\355\225\251.java" new file mode 100644 index 0000000..375762c --- /dev/null +++ "b/Array/3273-\353\221\220\354\210\230\354\235\230\355\225\251.java" @@ -0,0 +1,73 @@ +package Array; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; + +public class Array3273두수의합 { + + public static void main(String[] args) throws Exception { + // 수열의 크기 n은 9 이하임 + // 이때 두 수의 합이 x인 경우의 수를 구하는 문제 + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + visitArray(br); + } + + private static void twoPointer(BufferedReader br) throws IOException { + int max = Integer.parseInt(br.readLine()); + String[] arr = br.readLine().split(" "); + int target = Integer.parseInt(br.readLine()); + br.close(); + + int[] nums = new int[max]; + for (int i = 0; i < max; i++) { + nums[i] = Integer.parseInt(arr[i]); + } + + Arrays.sort(nums); + + int leftIndex = 0; + int rightIndex = max - 1; + int answer = 0; + + while (leftIndex < rightIndex) { + int sum = nums[leftIndex] + nums[rightIndex]; + if (sum > target) { + rightIndex--; + } else if (sum < target) { + leftIndex++; + } else { + answer++; + leftIndex++; + rightIndex--; + } + } + + System.out.println(answer); + } + + private static void visitArray(BufferedReader br) throws IOException { + int max = Integer.parseInt(br.readLine()); + String[] arr = br.readLine().split(" "); + int targetNumber = Integer.parseInt(br.readLine()); + br.close(); + + int[] nums = new int[max]; + for (int i = 0; i < max; i++) { + nums[i] = Integer.parseInt(arr[i]); + } + + boolean[] visited = new boolean[1000001]; + int count = 0; + int needNumber = 0; + for (int i = 0; i < max; i++) { + needNumber = targetNumber - nums[i]; + if (needNumber >= 1 && needNumber < 1000000 && visited[needNumber]) { + count++; + } + visited[nums[i]] = true; + } + System.out.println(count); + } +} \ No newline at end of file diff --git a/Main.java b/Main.java new file mode 100644 index 0000000..47ef066 --- /dev/null +++ b/Main.java @@ -0,0 +1,46 @@ +import java.io.*; +import java.util.*; + +public class Main { + + public static void main(String[] args) throws Exception { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String[] condition = br.readLine().split(" "); + int totalPeople = Integer.parseInt(condition[0]); + int maxPeople = Integer.parseInt(condition[1]); + String[] studentInfo; + + int[] genderCollector = new int[totalPeople]; + int[] gradeCollector = new int[totalPeople]; + + int girl = 0; + int man = 0; + + for (int i = 0; i < totalPeople; i++) { + studentInfo = br.readLine().split(" "); + genderCollector[i] = Integer.parseInt(studentInfo[0]); + gradeCollector[i] = Integer.parseInt(studentInfo[1]); + } + + int roomCount = 0; + for(int i = 1; i <= 6; i++) { + for (int j = 0; j Date: Wed, 4 Jun 2025 13:52:08 +0900 Subject: [PATCH 02/11] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactor:=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=9D=BC?= =?UTF-8?q?=EB=B6=80=20=EC=95=8C=EA=B3=A0=EB=A6=AC=EC=A6=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\353\260\251\353\260\260\354\240\225.java" | 10 +++ ...\353\247\214\353\223\244\352\270\260.java" | 35 ++++++++-- Main.java | 64 +++++++------------ 3 files changed, 62 insertions(+), 47 deletions(-) diff --git "a/Array/13300-\353\260\251\353\260\260\354\240\225.java" "b/Array/13300-\353\260\251\353\260\260\354\240\225.java" index f4eeb55..586ff36 100644 --- "a/Array/13300-\353\260\251\353\260\260\354\240\225.java" +++ "b/Array/13300-\353\260\251\353\260\260\354\240\225.java" @@ -8,26 +8,34 @@ public class Array13300방배정 { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + // 참가하는 학생 수, 최대 방 배정 인원 String[] condition = br.readLine().split(" "); int totalPeople = Integer.parseInt(condition[0]); int maxPeople = Integer.parseInt(condition[1]); String[] studentInfo; + // 성별, 학년 카운트를 위한 배열 선언 int[] genderCollector = new int[totalPeople]; int[] gradeCollector = new int[totalPeople]; + // 남, 여 카운트를 위한 변수 선언 int girl = 0; int man = 0; + // 전체 인원 수 만큼 순회하여 성별, 학년을 분리 for (int i = 0; i < totalPeople; i++) { studentInfo = br.readLine().split(" "); genderCollector[i] = Integer.parseInt(studentInfo[0]); gradeCollector[i] = Integer.parseInt(studentInfo[1]); } + // 방 개수를 구하는 로직 int roomCount = 0; + // 1 ~ 6학년 순회 for(int i = 1; i <= 6; i++) { + // 모든 학생을 대상으로 순회 for (int j = 0; j nums[i]) { + // count += nums[i]*-1; + // } else { + // count += nums[i]; + // } + // } + // } + // System.out.println(count); + // } + public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); @@ -21,13 +48,7 @@ public static void main(String[] args) throws Exception { } int count = 0; for (int i = 0; i < nums.length; i++) { - if(0 != nums[i]) { - if(0 > nums[i]) { - count += nums[i]*-1; - } else { - count += nums[i]; - } - } + count += Math.abs(nums[i]); } System.out.println(count); } diff --git a/Main.java b/Main.java index 47ef066..c33dafe 100644 --- a/Main.java +++ b/Main.java @@ -1,46 +1,30 @@ -import java.io.*; -import java.util.*; +import java.io.BufferedReader; +import java.io.InputStreamReader; public class Main { - public static void main(String[] args) throws Exception { - - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - String[] condition = br.readLine().split(" "); - int totalPeople = Integer.parseInt(condition[0]); - int maxPeople = Integer.parseInt(condition[1]); - String[] studentInfo; - - int[] genderCollector = new int[totalPeople]; - int[] gradeCollector = new int[totalPeople]; - - int girl = 0; - int man = 0; - - for (int i = 0; i < totalPeople; i++) { - studentInfo = br.readLine().split(" "); - genderCollector[i] = Integer.parseInt(studentInfo[0]); - gradeCollector[i] = Integer.parseInt(studentInfo[1]); - } - - int roomCount = 0; - for(int i = 1; i <= 6; i++) { - for (int j = 0; j Date: Sat, 7 Jun 2025 18:21:02 +0900 Subject: [PATCH 03/11] =?UTF-8?q?=F0=9F=93=9D=20Docs:=20=EC=A3=BC=EC=84=9D?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3273-\353\221\220\354\210\230\354\235\230\355\225\251.java" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/Array/3273-\353\221\220\354\210\230\354\235\230\355\225\251.java" "b/Array/3273-\353\221\220\354\210\230\354\235\230\355\225\251.java" index 375762c..b0bd798 100644 --- "a/Array/3273-\353\221\220\354\210\230\354\235\230\355\225\251.java" +++ "b/Array/3273-\353\221\220\354\210\230\354\235\230\355\225\251.java" @@ -14,6 +14,8 @@ public static void main(String[] args) throws Exception { visitArray(br); } + // 방문 배열에 대한 자세한 공부가 더 필요함 + // 각 요소를 true, false로 바꾸며 O(1)의 시간 복잡도를 가지는 것이 특장점임 private static void twoPointer(BufferedReader br) throws IOException { int max = Integer.parseInt(br.readLine()); String[] arr = br.readLine().split(" "); From 437010a99a33c2955676db4082d66b01e9bdbe28 Mon Sep 17 00:00:00 2001 From: Ansik Jung Date: Sat, 14 Jun 2025 23:15:38 +0900 Subject: [PATCH 04/11] =?UTF-8?q?=E2=9C=A8=20Linkedlist=20=EC=95=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=EC=A6=98=20=ED=92=80=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 요세푸스 문제, 에디터, 키로거 --- .gitignore | 2 + LinkedList/.gitkeep | 0 ...\354\212\244\353\254\270\354\240\234.java" | 36 +++++++++++++++ ...\354\227\220\353\224\224\355\204\260.java" | 41 +++++++++++++++++ ...\355\202\244\353\241\234\352\261\260.java" | 36 +++++++++++++++ Main.java | 44 +++++++++++-------- 6 files changed, 140 insertions(+), 19 deletions(-) create mode 100644 .gitignore delete mode 100644 LinkedList/.gitkeep create mode 100644 "LinkedList/1158-\354\232\224\354\204\270\355\221\270\354\212\244\353\254\270\354\240\234.java" create mode 100644 "LinkedList/1406-\354\227\220\353\224\224\355\204\260.java" create mode 100644 "LinkedList/5397-\355\202\244\353\241\234\352\261\260.java" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3cb4b7b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/out/ +/.idea/ \ No newline at end of file diff --git a/LinkedList/.gitkeep b/LinkedList/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git "a/LinkedList/1158-\354\232\224\354\204\270\355\221\270\354\212\244\353\254\270\354\240\234.java" "b/LinkedList/1158-\354\232\224\354\204\270\355\221\270\354\212\244\353\254\270\354\240\234.java" new file mode 100644 index 0000000..0f06530 --- /dev/null +++ "b/LinkedList/1158-\354\232\224\354\204\270\355\221\270\354\212\244\353\254\270\354\240\234.java" @@ -0,0 +1,36 @@ +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.LinkedList; +import java.util.List; + +public class Main { + public static void main(String[] args) throws Exception { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String[] input = br.readLine().split(" "); + int size = Integer.parseInt(input[0]); + int targetNum = Integer.parseInt(input[1]); + + List list = new LinkedList<>(); + + for (int i = 1; i <= size; i++) { + list.add(i); + } + + StringBuilder sb = new StringBuilder(); + sb.append("<"); + + int index = 0; + while (!list.isEmpty()) { + index = (index + targetNum - 1) % list.size(); + sb.append(list.remove(index)); + + if (!list.isEmpty()) { + sb.append(", "); + } + } + + sb.append(">"); + System.out.println(sb); + } +} diff --git "a/LinkedList/1406-\354\227\220\353\224\224\355\204\260.java" "b/LinkedList/1406-\354\227\220\353\224\224\355\204\260.java" new file mode 100644 index 0000000..57b86f5 --- /dev/null +++ "b/LinkedList/1406-\354\227\220\353\224\224\355\204\260.java" @@ -0,0 +1,41 @@ +import java.io.*; +import java.util.*; + +public class Main { + public static void main(String[] args) throws Exception { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringBuilder sb = new StringBuilder(); + + LinkedList editor = new LinkedList<>(); + for (char c : br.readLine().toCharArray()) { + editor.add(c); + } + + int orderCount = Integer.parseInt(br.readLine()); + ListIterator cursor = editor.listIterator(); + + while (cursor.hasNext()){ + cursor.next(); + } + + for (int i = 0; i < orderCount; i++) { + String command = br.readLine(); + char charCommand = command.charAt(0); + + if (charCommand == 'L' && cursor.hasPrevious()) { + cursor.previous(); + } else if (charCommand == 'D' && cursor.hasNext()) { + cursor.next(); + } else if (charCommand == 'B' && cursor.hasPrevious()) { + cursor.previous(); + cursor.remove(); + } else if (charCommand == 'P') { + cursor.add(command.charAt(2)); + } + } + + for (char c : editor) sb.append(c); + System.out.println(sb); + } +} diff --git "a/LinkedList/5397-\355\202\244\353\241\234\352\261\260.java" "b/LinkedList/5397-\355\202\244\353\241\234\352\261\260.java" new file mode 100644 index 0000000..3b114b6 --- /dev/null +++ "b/LinkedList/5397-\355\202\244\353\241\234\352\261\260.java" @@ -0,0 +1,36 @@ +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.LinkedList; +import java.util.ListIterator; + +public class Main { + public static void main(String[] args) throws Exception { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int maxCaseNumber = Integer.parseInt(br.readLine()); + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < maxCaseNumber; i++) { + LinkedList inputList = new LinkedList<>(); + ListIterator cursor = inputList.listIterator(); + + for (char ch : br.readLine().toCharArray()) { + if (ch == '<' && cursor.hasPrevious()) { + cursor.previous(); + } else if (ch == '>' && cursor.hasNext()) { + cursor.next(); + } else if (ch == '-' && cursor.hasPrevious()) { + cursor.previous(); + cursor.remove(); + } else if (ch != '-' && ch != '<' && ch != '>') { + cursor.add(ch); + } + } + for (char ch : inputList) { + sb.append(ch); + } + sb.append("\n"); + } + System.out.println(sb); + } +} diff --git a/Main.java b/Main.java index c33dafe..0f06530 100644 --- a/Main.java +++ b/Main.java @@ -1,30 +1,36 @@ import java.io.BufferedReader; import java.io.InputStreamReader; +import java.util.LinkedList; +import java.util.List; public class Main { + public static void main(String[] args) throws Exception { - public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String[] input = br.readLine().split(" "); + int size = Integer.parseInt(input[0]); + int targetNum = Integer.parseInt(input[1]); - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - String firstNums = br.readLine(); - String secondNums = br.readLine(); + List list = new LinkedList<>(); - int[] nums = new int[26]; - int[] nums2 = new int[26]; + for (int i = 1; i <= size; i++) { + list.add(i); + } - for (int i = 0; i < firstNums.length(); i++) { - nums[firstNums.charAt(i) - 'a']++; - } + StringBuilder sb = new StringBuilder(); + sb.append("<"); - for (int i = 0; i < secondNums.length(); i++) { - nums2[secondNums.charAt(i) - 'a']++; - } - int count = 0; - for (int i = 0; i < nums.length; i++) { - count += (Math.abs(nums[i] - nums2[i])); - } - System.out.println(count); - } -} + int index = 0; + while (!list.isEmpty()) { + index = (index + targetNum - 1) % list.size(); + sb.append(list.remove(index)); + if (!list.isEmpty()) { + sb.append(", "); + } + } + sb.append(">"); + System.out.println(sb); + } +} From b39ed0fc5995602f410f1f17a7386dd6eb084990 Mon Sep 17 00:00:00 2001 From: Ansik Jung Date: Sun, 15 Jun 2025 15:59:07 +0900 Subject: [PATCH 05/11] =?UTF-8?q?=F0=9F=93=9D=20Docs:=20=EC=96=91=EC=8B=9D?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Docs: 양식 수정 --- ...204\270\355\221\270\354\212\244\353\254\270\354\240\234.java" | 1 + 1 file changed, 1 insertion(+) diff --git "a/LinkedList/1158-\354\232\224\354\204\270\355\221\270\354\212\244\353\254\270\354\240\234.java" "b/LinkedList/1158-\354\232\224\354\204\270\355\221\270\354\212\244\353\254\270\354\240\234.java" index 0f06530..e7143ac 100644 --- "a/LinkedList/1158-\354\232\224\354\204\270\355\221\270\354\212\244\353\254\270\354\240\234.java" +++ "b/LinkedList/1158-\354\232\224\354\204\270\355\221\270\354\212\244\353\254\270\354\240\234.java" @@ -21,6 +21,7 @@ public static void main(String[] args) throws Exception { sb.append("<"); int index = 0; + while (!list.isEmpty()) { index = (index + targetNum - 1) % list.size(); sb.append(list.remove(index)); From 656dd8fda3c52e5ac2cd3437d28b2a30505dbb94 Mon Sep 17 00:00:00 2001 From: Ansik Jung Date: Sat, 28 Jun 2025 09:23:19 +0900 Subject: [PATCH 06/11] =?UTF-8?q?10845=20=ED=81=90=20=EB=AC=B8=EC=A0=9C?= =?UTF-8?q?=ED=92=80=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Main.java | 50 ++++++++++++++++----------------- "Queue/10845-\355\201\220.java" | 36 ++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 25 deletions(-) create mode 100644 "Queue/10845-\355\201\220.java" diff --git a/Main.java b/Main.java index 0f06530..2055605 100644 --- a/Main.java +++ b/Main.java @@ -1,36 +1,36 @@ import java.io.BufferedReader; import java.io.InputStreamReader; -import java.util.LinkedList; -import java.util.List; +import java.util.ArrayDeque; +import java.util.Deque; public class Main { - public static void main(String[] args) throws Exception { + public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - String[] input = br.readLine().split(" "); - int size = Integer.parseInt(input[0]); - int targetNum = Integer.parseInt(input[1]); - - List list = new LinkedList<>(); - - for (int i = 1; i <= size; i++) { - list.add(i); - } - StringBuilder sb = new StringBuilder(); - sb.append("<"); - - int index = 0; - while (!list.isEmpty()) { - index = (index + targetNum - 1) % list.size(); - sb.append(list.remove(index)); - - if (!list.isEmpty()) { - sb.append(", "); + Deque queue = new ArrayDeque<>(); + + int orderNumber = Integer.parseInt(br.readLine()); + + while (orderNumber-- > 0) { + String order = br.readLine(); + + if (order.startsWith("push")) { + int targetInt = Integer.parseInt(order.substring(5)); + queue.addLast(targetInt); + } else if (order.equals("pop")) { + sb.append(queue.isEmpty() ? -1 : queue.removeFirst()).append('\n'); + } else if (order.equals("size")) { + sb.append(queue.size()).append('\n'); + } else if (order.equals("empty")) { + sb.append(queue.isEmpty() ? 1 : 0).append('\n'); + } else if (order.equals("front")) { + sb.append(queue.isEmpty() ? -1 : queue.peekFirst()).append('\n'); + } else if (order.equals("back")) { + sb.append(queue.isEmpty() ? -1 : queue.peekLast()).append('\n'); } - } - sb.append(">"); - System.out.println(sb); + } + System.out.print(sb); } } diff --git "a/Queue/10845-\355\201\220.java" "b/Queue/10845-\355\201\220.java" new file mode 100644 index 0000000..2055605 --- /dev/null +++ "b/Queue/10845-\355\201\220.java" @@ -0,0 +1,36 @@ +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.ArrayDeque; +import java.util.Deque; + +public class Main { + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringBuilder sb = new StringBuilder(); + Deque queue = new ArrayDeque<>(); + + int orderNumber = Integer.parseInt(br.readLine()); + + while (orderNumber-- > 0) { + String order = br.readLine(); + + if (order.startsWith("push")) { + int targetInt = Integer.parseInt(order.substring(5)); + queue.addLast(targetInt); + } else if (order.equals("pop")) { + sb.append(queue.isEmpty() ? -1 : queue.removeFirst()).append('\n'); + } else if (order.equals("size")) { + sb.append(queue.size()).append('\n'); + } else if (order.equals("empty")) { + sb.append(queue.isEmpty() ? 1 : 0).append('\n'); + } else if (order.equals("front")) { + sb.append(queue.isEmpty() ? -1 : queue.peekFirst()).append('\n'); + } else if (order.equals("back")) { + sb.append(queue.isEmpty() ? -1 : queue.peekLast()).append('\n'); + } + + } + System.out.print(sb); + } +} From a75abf001adc13262722d250abdcd72fb4ce53b8 Mon Sep 17 00:00:00 2001 From: leelise Date: Sat, 12 Jul 2025 09:25:45 +0900 Subject: [PATCH 07/11] 7/12 --- BFS/.gitkeep | 0 ...\354\240\204\354\230\201\354\227\255.java" | 68 +++++++++++++++ ...\352\265\254\355\225\230\352\270\260.java" | 86 +++++++++++++++++++ Graph/.gitkeep | 0 "Graph/1260-DFS\354\231\200BFS.java" | 74 ++++++++++++++++ Main.java | 62 +++++++------ Stack/.gitkeep | 0 ...\353\247\211\353\214\200\352\270\260.java" | 33 +++++++ ...\355\230\270\354\235\230\352\260\222.java" | 52 +++++++++++ ...\354\235\200\353\213\250\354\226\264.java" | 33 +++++++ 10 files changed, 384 insertions(+), 24 deletions(-) delete mode 100644 BFS/.gitkeep create mode 100644 "BFS/2468-\354\225\210\354\240\204\354\230\201\354\227\255.java" create mode 100644 "BFS/2583-\354\230\201\354\227\255\352\265\254\355\225\230\352\270\260.java" delete mode 100644 Graph/.gitkeep create mode 100644 "Graph/1260-DFS\354\231\200BFS.java" delete mode 100644 Stack/.gitkeep create mode 100644 "Stack/10799-\354\207\240\353\247\211\353\214\200\352\270\260.java" create mode 100644 "Stack/2504-\352\264\204\355\230\270\354\235\230\352\260\222.java" create mode 100644 "Stack/3986-\354\242\213\354\235\200\353\213\250\354\226\264.java" diff --git a/BFS/.gitkeep b/BFS/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git "a/BFS/2468-\354\225\210\354\240\204\354\230\201\354\227\255.java" "b/BFS/2468-\354\225\210\354\240\204\354\230\201\354\227\255.java" new file mode 100644 index 0000000..07f3a3c --- /dev/null +++ "b/BFS/2468-\354\225\210\354\240\204\354\230\201\354\227\255.java" @@ -0,0 +1,68 @@ +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.LinkedList; +import java.util.Queue; +import java.util.StringTokenizer; + +public class Main { + static int N; + static int[][] area; + static int[] dx = {0, 0, -1, 1}; + static int[] dy = {-1, 1, 0, 0}; + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + N = Integer.parseInt(br.readLine()); + area = new int[N][N]; + + for (int i = 0; i < N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int j = 0; j < N; j++) { + area[i][j] = Integer.parseInt(st.nextToken()); + } + } + + int maxSafeAreas = 1; + for (int h = 1; h <= 100; h++) { + boolean[][] visited = new boolean[N][N]; + int safeAreasCount = 0; + + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + if (!visited[i][j] && area[i][j] > h) { + bfs(i, j, h, visited); + safeAreasCount++; + } + } + } + if (safeAreasCount > maxSafeAreas) { + maxSafeAreas = safeAreasCount; + } + } + System.out.println(maxSafeAreas); + } + + static void bfs(int y, int x, int h, boolean[][] visited) { + Queue q = new LinkedList<>(); + q.offer(new int[] {y, x}); + visited[y][x] = true; + + while (!q.isEmpty()) { + int[] cur = q.poll(); + int cy = cur[0]; + int cx = cur[1]; + + for (int d = 0; d < 4; d++) { + int ny = cy + dy[d]; + int nx = cx + dx[d]; + + if (ny >= 0 && ny < N && nx >= 0 && nx < N) { + if (!visited[ny][nx] && area[ny][nx] > h) { + visited[ny][nx] = true; + q.offer(new int[] {ny, nx}); + } + } + } + } + } +} diff --git "a/BFS/2583-\354\230\201\354\227\255\352\265\254\355\225\230\352\270\260.java" "b/BFS/2583-\354\230\201\354\227\255\352\265\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..b2785b9 --- /dev/null +++ "b/BFS/2583-\354\230\201\354\227\255\352\265\254\355\225\230\352\270\260.java" @@ -0,0 +1,86 @@ +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import java.util.StringTokenizer; + +public class Main { + public static int M, N, K; // 세로(M), 가로(N), 직사각형 개수(K) + public static boolean[][] visited; // 격자판 방문 및 막힘 체크 + public static int[] dx = {0, 0, -1, 1}; // 좌우 이동 (x 방향) + public static int[] dy = {-1, 1, 0, 0}; // 상하 이동 (y 방향) + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + M = Integer.parseInt(st.nextToken()); + N = Integer.parseInt(st.nextToken()); + K = Integer.parseInt(st.nextToken()); + visited = new boolean[M][N]; + + for (int i = 0; i < K; i++) { + st = new StringTokenizer(br.readLine()); + int x1 = Integer.parseInt(st.nextToken()); + int y1 = Integer.parseInt(st.nextToken()); + int x2 = Integer.parseInt(st.nextToken()); + int y2 = Integer.parseInt(st.nextToken()); + + // 영역 true로 표시 + for (int y = y1; y < y2; y++) { + for (int x = x1; x < x2; x++) { + visited[y][x] = true; + } + } + } + + List areas = new ArrayList<>(); + + for (int i = 0; i < M; i++) { // 세로 + for (int j = 0; j < N; j++) { // 가로 + if (!visited[i][j]) { + areas.add(bfs(j, i)); + } + } + } + + Collections.sort(areas); + System.out.println(areas.size()); + + for (int area : areas) { + System.out.print(area + " "); + } + } + + private static int bfs(int x, int y) { + Queue q = new LinkedList<>(); + q.offer(new int[] {x, y}); + visited[y][x] = true; // 시작점 방문 처리 + int count = 1; // bfs가 호출된 순간 1개는 확정 + + while (!q.isEmpty()) { + int[] now = q.poll(); + int nowX = now[0]; + int nowY = now[1]; + + // 상하좌우 4방향 탐색 + for (int d = 0; d < 4; d++) { + int nx = nowX + dx[d]; + int ny = nowY + dy[d]; + + // 방문체크 및 큐 추가 + if (nx >= 0 && nx < N && ny >= 0 && ny < M) { + if (!visited[ny][nx]) { + visited[ny][nx] = true; + q.offer(new int[] {nx, ny}); + count++; + } + } + } + } + return count; + } +} + diff --git a/Graph/.gitkeep b/Graph/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git "a/Graph/1260-DFS\354\231\200BFS.java" "b/Graph/1260-DFS\354\231\200BFS.java" new file mode 100644 index 0000000..23c431e --- /dev/null +++ "b/Graph/1260-DFS\354\231\200BFS.java" @@ -0,0 +1,74 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; +import java.util.Queue; +import java.util.StringTokenizer; + +public class Main { + private static boolean[] visited; + private static ArrayList[] graph; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + int N = Integer.parseInt(st.nextToken()); + int M = Integer.parseInt(st.nextToken()); + int V = Integer.parseInt(st.nextToken()); + + graph = new ArrayList[N + 1]; + for (int i = 1; i <= N; i++) { + graph[i] = new ArrayList<>(); + } + + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + int u = Integer.parseInt(st.nextToken()); + int v = Integer.parseInt(st.nextToken()); + graph[u].add(v); + graph[v].add(u); + } + + for (int i = 1; i <= N; i++) { + Collections.sort(graph[i]); + } + + visited = new boolean[N + 1]; + dfs(V); + System.out.println(); + + visited = new boolean[N + 1]; + bfs(V); + System.out.println(); + } + + private static void dfs(int node) { + visited[node] = true; + System.out.print(node + " "); + for (int next : graph[node]) { + if (!visited[next]) { + dfs(next); + } + } + } + + private static void bfs(int start) { + Queue q = new LinkedList<>(); + q.offer(start); + visited[start] = true; + + while (!q.isEmpty()) { + int cur = q.poll(); + System.out.print(cur + " "); + for (int next : graph[cur]) { + if (!visited[next]) { + visited[next] = true; + q.offer(next); + } + } + } + } +} diff --git a/Main.java b/Main.java index 2055605..c10667a 100644 --- a/Main.java +++ b/Main.java @@ -5,32 +5,46 @@ public class Main { - public static void main(String[] args) throws Exception { - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - StringBuilder sb = new StringBuilder(); - Deque queue = new ArrayDeque<>(); + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int n = Integer.parseInt(br.readLine()); + int[] parent = new int[n]; + String[] input = br.readLine().split(" "); + int delete = Integer.parseInt(br.readLine()); - int orderNumber = Integer.parseInt(br.readLine()); + if (delete == 0) { + System.out.println(0); + return; + } - while (orderNumber-- > 0) { - String order = br.readLine(); + for (int i = 0; i < n; i++) { + if (i == delete) { + parent[i] = -2; + } else { + int p = Integer.parseInt(input[i]); + if (p != -1 && parent[p] == -2) { + parent[i] = -2; + } else { + parent[i] = p; + } + } + } - if (order.startsWith("push")) { - int targetInt = Integer.parseInt(order.substring(5)); - queue.addLast(targetInt); - } else if (order.equals("pop")) { - sb.append(queue.isEmpty() ? -1 : queue.removeFirst()).append('\n'); - } else if (order.equals("size")) { - sb.append(queue.size()).append('\n'); - } else if (order.equals("empty")) { - sb.append(queue.isEmpty() ? 1 : 0).append('\n'); - } else if (order.equals("front")) { - sb.append(queue.isEmpty() ? -1 : queue.peekFirst()).append('\n'); - } else if (order.equals("back")) { - sb.append(queue.isEmpty() ? -1 : queue.peekLast()).append('\n'); - } + int leafCount = 0; + for (int i = 0; i < n; i++) { + if (parent[i] == -2) continue; + boolean isLeaf = true; + for (int j = 0; j < n; j++) { + if (parent[j] == i) { + isLeaf = false; + break; + } + } + if (isLeaf) { + leafCount++; + } + } - } - System.out.print(sb); - } + System.out.println(leafCount); + } } diff --git a/Stack/.gitkeep b/Stack/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git "a/Stack/10799-\354\207\240\353\247\211\353\214\200\352\270\260.java" "b/Stack/10799-\354\207\240\353\247\211\353\214\200\352\270\260.java" new file mode 100644 index 0000000..522f9ce --- /dev/null +++ "b/Stack/10799-\354\207\240\353\247\211\353\214\200\352\270\260.java" @@ -0,0 +1,33 @@ +import java.io.BufferedReader; +import java.io.InputStreamReader; + +public class Main { + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + String line = br.readLine(); + int result = 0; + int count = 0; + char prev = ' '; + + for (int i = 0; i < line.length(); i++) { + char curr = line.charAt(i); + + if (curr == '(') { + count++; + } else { + count--; + + if (prev == '(') { + result += count; + } else { + result += 1; + } + } + prev = curr; + } + + System.out.println(result); + } +} diff --git "a/Stack/2504-\352\264\204\355\230\270\354\235\230\352\260\222.java" "b/Stack/2504-\352\264\204\355\230\270\354\235\230\352\260\222.java" new file mode 100644 index 0000000..17e0e03 --- /dev/null +++ "b/Stack/2504-\352\264\204\355\230\270\354\235\230\352\260\222.java" @@ -0,0 +1,52 @@ +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.Stack; + +public class Main { + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String line = br.readLine(); + Stack stack = new Stack<>(); + boolean isValid = true; + + for (char ch : line.toCharArray()) { + if (ch == '(' || ch == '[') { + stack.push(ch); + } else { + int temp = 0; + + while (!stack.isEmpty() && stack.peek() instanceof Integer) { + temp += (int)stack.pop(); + } + + if (stack.isEmpty()) { + isValid = false; + break; + } + + char open = (char)stack.pop(); + if ((ch == ')' && open == '(')) { + stack.push(temp == 0 ? 2 : 2 * temp); + } else if ((ch == ']' && open == '[')) { + stack.push(temp == 0 ? 3 : 3 * temp); + } else { + isValid = false; + break; + } + } + } + + int result = 0; + for (Object obj : stack) { + if (obj instanceof Character) { + isValid = false; + break; + } else { + result += (int)obj; + } + } + + System.out.println(isValid ? result : 0); + } +} diff --git "a/Stack/3986-\354\242\213\354\235\200\353\213\250\354\226\264.java" "b/Stack/3986-\354\242\213\354\235\200\353\213\250\354\226\264.java" new file mode 100644 index 0000000..c1ffb08 --- /dev/null +++ "b/Stack/3986-\354\242\213\354\235\200\353\213\250\354\226\264.java" @@ -0,0 +1,33 @@ +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.Stack; + +public class Main { + + public static void main(String[] args) throws Exception { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int maxNum = Integer.parseInt(br.readLine()); + int goodWordCount = 0; + + for (int i = 0; i < maxNum; i++) { + String word = br.readLine(); + Stack stack = new Stack<>(); + + for (char c : word.toCharArray()) { + if (!stack.isEmpty() && stack.peek() == c) { + stack.pop(); + } else { + stack.push(c); + } + } + + if (stack.isEmpty()) { + goodWordCount++; + } + } + + System.out.println(goodWordCount); + } +} + From 2e248013a0bb08368736f129cdffecdeaaf695c9 Mon Sep 17 00:00:00 2001 From: leelise Date: Sat, 26 Jul 2025 09:07:19 +0900 Subject: [PATCH 08/11] =?UTF-8?q?=E2=9C=A8=20Feat:=207-26=20=EC=95=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=EC=A6=98=20=ED=92=80=EC=9D=B4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: 7-26 알고리즘 풀이 추가 --- ...\354\235\230\354\235\264\353\217\231.java" | 60 +++++++ DFS/.gitkeep | 0 ...\353\241\234\354\240\235\355\212\270.java" | 156 ++++++++++++++++++ Main.java | 80 +++++---- Simulation/.gitkeep | 0 ...\353\260\224\353\235\274\352\270\260.java" | 60 +++++++ 6 files changed, 321 insertions(+), 35 deletions(-) create mode 100644 "BFS/7562-\353\202\230\354\235\264\355\212\270\354\235\230\354\235\264\353\217\231.java" delete mode 100644 DFS/.gitkeep create mode 100644 "DFS/9466-\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270.java" delete mode 100644 Simulation/.gitkeep create mode 100644 "Simulation/21610-\353\247\210\353\262\225\354\202\254\354\203\201\354\226\264\354\231\200\353\271\204\353\260\224\353\235\274\352\270\260.java" diff --git "a/BFS/7562-\353\202\230\354\235\264\355\212\270\354\235\230\354\235\264\353\217\231.java" "b/BFS/7562-\353\202\230\354\235\264\355\212\270\354\235\230\354\235\264\353\217\231.java" new file mode 100644 index 0000000..5e857f3 --- /dev/null +++ "b/BFS/7562-\353\202\230\354\235\264\355\212\270\354\235\230\354\235\264\353\217\231.java" @@ -0,0 +1,60 @@ +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.StringTokenizer; + +public class Main { + + static final int[] dx = {1, 2, 2, 1, -1, -2, -2, -1}; + static final int[] dy = {2, 1, -1, -2, -2, -1, 1, 2}; + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringBuilder sb = new StringBuilder(); + + int caseCount = Integer.parseInt(br.readLine()); + while (caseCount-- > 0) { + int line = Integer.parseInt(br.readLine()); + + StringTokenizer st = new StringTokenizer(br.readLine()); + int sx = Integer.parseInt(st.nextToken()); + int sy = Integer.parseInt(st.nextToken()); + + st = new StringTokenizer(br.readLine()); + int tx = Integer.parseInt(st.nextToken()); + int ty = Integer.parseInt(st.nextToken()); + + sb.append(bfs(line, sx, sy, tx, ty)).append('\n'); + } + + System.out.print(sb); + } + + static int bfs(int l, int sx, int sy, int tx, int ty) { + if (sx == tx && sy == ty) + return 0; + + boolean[][] visited = new boolean[l][l]; + Deque q = new ArrayDeque<>(); + q.offer(new int[] {sx, sy, 0}); + visited[sx][sy] = true; + + while (!q.isEmpty()) { + int[] cur = q.poll(); + int x = cur[0], y = cur[1], d = cur[2]; + + for (int i = 0; i < 8; i++) { + int nx = x + dx[i]; + int ny = y + dy[i]; + if (0 <= nx && nx < l && 0 <= ny && ny < l && !visited[nx][ny]) { + if (nx == tx && ny == ty) + return d + 1; + visited[nx][ny] = true; + q.offer(new int[] {nx, ny, d + 1}); + } + } + } + return -1; + } +} diff --git a/DFS/.gitkeep b/DFS/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git "a/DFS/9466-\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270.java" "b/DFS/9466-\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270.java" new file mode 100644 index 0000000..70f0122 --- /dev/null +++ "b/DFS/9466-\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270.java" @@ -0,0 +1,156 @@ +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class Main { + + static int N, M; + static int[][] water; + static boolean[][] cloud; + + static final int[] dx = {0, 0, -1, -1, -1, 0, 1, 1, 1}; + static final int[] dy = {0, -1, -1, 0, 1, 1, 1, 0, -1}; + + // 대각선 4방향 (물복사버그) + static final int[] diagX = {-1, -1, 1, 1}; + static final int[] diagY = {-1, 1, -1, 1}; + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + + water = new int[N][N]; + + // 초기 물 + for (int r = 0; r < N; r++) { + st = new StringTokenizer(br.readLine()); + for (int c = 0; c < N; c++) { + water[r][c] = Integer.parseInt(st.nextToken()); + } + } + + // 초기 구름 + cloud = new boolean[N][N]; + cloud[N - 1][0] = true; + cloud[N - 1][1] = true; + cloud[N - 2][0] = true; + cloud[N - 2][1] = true; + + // M번 이동 + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + int direction = Integer.parseInt(st.nextToken()); + int steps = Integer.parseInt(st.nextToken()); + + moveCloud(direction, steps); + rain(); + waterCopyBug(); + createNewCloud(); + } + + // 최종 물의 양 합 출력 + System.out.println(getTotalWater()); + } + + /** + * 1. 구름 이동 + */ + static void moveCloud(int direction, int steps) { + boolean[][] newCloud = new boolean[N][N]; + int move = steps % N; // N의 배수번 이동하면 제자리 + + for (int r = 0; r < N; r++) { + for (int c = 0; c < N; c++) { + if (cloud[r][c]) { + int nr = (r + dx[direction] * move) % N; + int nc = (c + dy[direction] * move) % N; + + // 양수 보정 + if (nr < 0) + nr += N; + if (nc < 0) + nc += N; + + newCloud[nr][nc] = true; + } + } + } + cloud = newCloud; + } + + /** + * 2. 비 내림 (구름이 있는 칸의 물 +1) + */ + static void rain() { + for (int r = 0; r < N; r++) { + for (int c = 0; c < N; c++) { + if (cloud[r][c]) { + water[r][c]++; + } + } + } + } + + /** + * 3. 물복사버그 + * - 구름이 있던 칸에서 대각선 4칸 중 물이 있는 칸 개수만큼 물 증가 + */ + static void waterCopyBug() { + for (int r = 0; r < N; r++) { + for (int c = 0; c < N; c++) { + if (cloud[r][c]) { + int count = 0; + + for (int k = 0; k < 4; k++) { + int nr = r + diagX[k]; + int nc = c + diagY[k]; + + if (nr >= 0 && nr < N && nc >= 0 && nc < N) { + if (water[nr][nc] > 0) { + count++; + } + } + } + + water[r][c] += count; + } + } + } + } + + /** + * 4. 새로운 구름 생성 + * - 물이 2 이상인 칸에 새 구름 생성하고 물 2 줄임 + * - 직전에 구름이 있던 칸은 제외 + */ + static void createNewCloud() { + boolean[][] newCloud = new boolean[N][N]; + + for (int r = 0; r < N; r++) { + for (int c = 0; c < N; c++) { + if (!cloud[r][c] && water[r][c] >= 2) { + water[r][c] -= 2; + newCloud[r][c] = true; + } + } + } + + cloud = newCloud; + } + + /** + * 현재 전체 물 양 합산 + */ + static int getTotalWater() { + int sum = 0; + for (int r = 0; r < N; r++) { + for (int c = 0; c < N; c++) { + sum += water[r][c]; + } + } + return sum; + } +} diff --git a/Main.java b/Main.java index c10667a..016e797 100644 --- a/Main.java +++ b/Main.java @@ -1,50 +1,60 @@ import java.io.BufferedReader; import java.io.InputStreamReader; -import java.util.ArrayDeque; -import java.util.Deque; +import java.util.StringTokenizer; public class Main { + static int n; + static int[] select; // 각 학생이 선택한 학생 + static boolean[] visited; // DFS 방문 여부 + static boolean[] finished; // 해당 노드 DFS가 끝났는지 + static int teamCount; // 팀에 속한 학생 수 public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - int n = Integer.parseInt(br.readLine()); - int[] parent = new int[n]; - String[] input = br.readLine().split(" "); - int delete = Integer.parseInt(br.readLine()); - - if (delete == 0) { - System.out.println(0); - return; - } + StringBuilder sb = new StringBuilder(); - for (int i = 0; i < n; i++) { - if (i == delete) { - parent[i] = -2; - } else { - int p = Integer.parseInt(input[i]); - if (p != -1 && parent[p] == -2) { - parent[i] = -2; - } else { - parent[i] = p; - } + int T = Integer.parseInt(br.readLine()); + while (T-- > 0) { + n = Integer.parseInt(br.readLine()); + select = new int[n + 1]; + visited = new boolean[n + 1]; + finished = new boolean[n + 1]; + teamCount = 0; + + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int i = 1; i <= n; i++) { + select[i] = Integer.parseInt(st.nextToken()); } - } - int leafCount = 0; - for (int i = 0; i < n; i++) { - if (parent[i] == -2) continue; - boolean isLeaf = true; - for (int j = 0; j < n; j++) { - if (parent[j] == i) { - isLeaf = false; - break; + for (int i = 1; i <= n; i++) { + if (!visited[i]) { + dfs(i); } } - if (isLeaf) { - leafCount++; - } + + sb.append(n - teamCount).append('\n'); } + System.out.print(sb); + } - System.out.println(leafCount); + static void dfs(int node) { + visited[node] = true; + int next = select[node]; + + if (!visited[next]) { + dfs(next); + } else if (!finished[next]) { + teamCount += countCycle(next); + } + + finished[node] = true; + } + + static int countCycle(int start) { + int count = 1; + for (int i = select[start]; i != start; i = select[i]) { + count++; + } + return count; } -} +} \ No newline at end of file diff --git a/Simulation/.gitkeep b/Simulation/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git "a/Simulation/21610-\353\247\210\353\262\225\354\202\254\354\203\201\354\226\264\354\231\200\353\271\204\353\260\224\353\235\274\352\270\260.java" "b/Simulation/21610-\353\247\210\353\262\225\354\202\254\354\203\201\354\226\264\354\231\200\353\271\204\353\260\224\353\235\274\352\270\260.java" new file mode 100644 index 0000000..016e797 --- /dev/null +++ "b/Simulation/21610-\353\247\210\353\262\225\354\202\254\354\203\201\354\226\264\354\231\200\353\271\204\353\260\224\353\235\274\352\270\260.java" @@ -0,0 +1,60 @@ +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class Main { + static int n; + static int[] select; // 각 학생이 선택한 학생 + static boolean[] visited; // DFS 방문 여부 + static boolean[] finished; // 해당 노드 DFS가 끝났는지 + static int teamCount; // 팀에 속한 학생 수 + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringBuilder sb = new StringBuilder(); + + int T = Integer.parseInt(br.readLine()); + while (T-- > 0) { + n = Integer.parseInt(br.readLine()); + select = new int[n + 1]; + visited = new boolean[n + 1]; + finished = new boolean[n + 1]; + teamCount = 0; + + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int i = 1; i <= n; i++) { + select[i] = Integer.parseInt(st.nextToken()); + } + + for (int i = 1; i <= n; i++) { + if (!visited[i]) { + dfs(i); + } + } + + sb.append(n - teamCount).append('\n'); + } + System.out.print(sb); + } + + static void dfs(int node) { + visited[node] = true; + int next = select[node]; + + if (!visited[next]) { + dfs(next); + } else if (!finished[next]) { + teamCount += countCycle(next); + } + + finished[node] = true; + } + + static int countCycle(int start) { + int count = 1; + for (int i = select[start]; i != start; i = select[i]) { + count++; + } + return count; + } +} \ No newline at end of file From 0fe8d6a9b685f2ad488907a8e92aaf8f4a297179 Mon Sep 17 00:00:00 2001 From: leelise Date: Sat, 26 Jul 2025 09:09:36 +0900 Subject: [PATCH 09/11] =?UTF-8?q?=F0=9F=90=9B=20Fix:=20Class=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: Class 위치 수정 --- ...\353\241\234\354\240\235\355\212\270.java" | 170 ++++-------------- ...\353\260\224\353\235\274\352\270\260.java" | 170 ++++++++++++++---- 2 files changed, 170 insertions(+), 170 deletions(-) diff --git "a/DFS/9466-\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270.java" "b/DFS/9466-\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270.java" index 70f0122..016e797 100644 --- "a/DFS/9466-\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270.java" +++ "b/DFS/9466-\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270.java" @@ -3,154 +3,58 @@ import java.util.StringTokenizer; public class Main { - - static int N, M; - static int[][] water; - static boolean[][] cloud; - - static final int[] dx = {0, 0, -1, -1, -1, 0, 1, 1, 1}; - static final int[] dy = {0, -1, -1, 0, 1, 1, 1, 0, -1}; - - // 대각선 4방향 (물복사버그) - static final int[] diagX = {-1, -1, 1, 1}; - static final int[] diagY = {-1, 1, -1, 1}; + static int n; + static int[] select; // 각 학생이 선택한 학생 + static boolean[] visited; // DFS 방문 여부 + static boolean[] finished; // 해당 노드 DFS가 끝났는지 + static int teamCount; // 팀에 속한 학생 수 public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - StringTokenizer st = new StringTokenizer(br.readLine()); - - N = Integer.parseInt(st.nextToken()); - M = Integer.parseInt(st.nextToken()); - - water = new int[N][N]; - - // 초기 물 - for (int r = 0; r < N; r++) { - st = new StringTokenizer(br.readLine()); - for (int c = 0; c < N; c++) { - water[r][c] = Integer.parseInt(st.nextToken()); + StringBuilder sb = new StringBuilder(); + + int T = Integer.parseInt(br.readLine()); + while (T-- > 0) { + n = Integer.parseInt(br.readLine()); + select = new int[n + 1]; + visited = new boolean[n + 1]; + finished = new boolean[n + 1]; + teamCount = 0; + + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int i = 1; i <= n; i++) { + select[i] = Integer.parseInt(st.nextToken()); } - } - - // 초기 구름 - cloud = new boolean[N][N]; - cloud[N - 1][0] = true; - cloud[N - 1][1] = true; - cloud[N - 2][0] = true; - cloud[N - 2][1] = true; - - // M번 이동 - for (int i = 0; i < M; i++) { - st = new StringTokenizer(br.readLine()); - int direction = Integer.parseInt(st.nextToken()); - int steps = Integer.parseInt(st.nextToken()); - - moveCloud(direction, steps); - rain(); - waterCopyBug(); - createNewCloud(); - } - - // 최종 물의 양 합 출력 - System.out.println(getTotalWater()); - } - - /** - * 1. 구름 이동 - */ - static void moveCloud(int direction, int steps) { - boolean[][] newCloud = new boolean[N][N]; - int move = steps % N; // N의 배수번 이동하면 제자리 - - for (int r = 0; r < N; r++) { - for (int c = 0; c < N; c++) { - if (cloud[r][c]) { - int nr = (r + dx[direction] * move) % N; - int nc = (c + dy[direction] * move) % N; - - // 양수 보정 - if (nr < 0) - nr += N; - if (nc < 0) - nc += N; - newCloud[nr][nc] = true; + for (int i = 1; i <= n; i++) { + if (!visited[i]) { + dfs(i); } } - } - cloud = newCloud; - } - /** - * 2. 비 내림 (구름이 있는 칸의 물 +1) - */ - static void rain() { - for (int r = 0; r < N; r++) { - for (int c = 0; c < N; c++) { - if (cloud[r][c]) { - water[r][c]++; - } - } + sb.append(n - teamCount).append('\n'); } + System.out.print(sb); } - /** - * 3. 물복사버그 - * - 구름이 있던 칸에서 대각선 4칸 중 물이 있는 칸 개수만큼 물 증가 - */ - static void waterCopyBug() { - for (int r = 0; r < N; r++) { - for (int c = 0; c < N; c++) { - if (cloud[r][c]) { - int count = 0; + static void dfs(int node) { + visited[node] = true; + int next = select[node]; - for (int k = 0; k < 4; k++) { - int nr = r + diagX[k]; - int nc = c + diagY[k]; - - if (nr >= 0 && nr < N && nc >= 0 && nc < N) { - if (water[nr][nc] > 0) { - count++; - } - } - } - - water[r][c] += count; - } - } + if (!visited[next]) { + dfs(next); + } else if (!finished[next]) { + teamCount += countCycle(next); } - } - - /** - * 4. 새로운 구름 생성 - * - 물이 2 이상인 칸에 새 구름 생성하고 물 2 줄임 - * - 직전에 구름이 있던 칸은 제외 - */ - static void createNewCloud() { - boolean[][] newCloud = new boolean[N][N]; - for (int r = 0; r < N; r++) { - for (int c = 0; c < N; c++) { - if (!cloud[r][c] && water[r][c] >= 2) { - water[r][c] -= 2; - newCloud[r][c] = true; - } - } - } - - cloud = newCloud; + finished[node] = true; } - /** - * 현재 전체 물 양 합산 - */ - static int getTotalWater() { - int sum = 0; - for (int r = 0; r < N; r++) { - for (int c = 0; c < N; c++) { - sum += water[r][c]; - } + static int countCycle(int start) { + int count = 1; + for (int i = select[start]; i != start; i = select[i]) { + count++; } - return sum; + return count; } -} +} \ No newline at end of file diff --git "a/Simulation/21610-\353\247\210\353\262\225\354\202\254\354\203\201\354\226\264\354\231\200\353\271\204\353\260\224\353\235\274\352\270\260.java" "b/Simulation/21610-\353\247\210\353\262\225\354\202\254\354\203\201\354\226\264\354\231\200\353\271\204\353\260\224\353\235\274\352\270\260.java" index 016e797..70f0122 100644 --- "a/Simulation/21610-\353\247\210\353\262\225\354\202\254\354\203\201\354\226\264\354\231\200\353\271\204\353\260\224\353\235\274\352\270\260.java" +++ "b/Simulation/21610-\353\247\210\353\262\225\354\202\254\354\203\201\354\226\264\354\231\200\353\271\204\353\260\224\353\235\274\352\270\260.java" @@ -3,58 +3,154 @@ import java.util.StringTokenizer; public class Main { - static int n; - static int[] select; // 각 학생이 선택한 학생 - static boolean[] visited; // DFS 방문 여부 - static boolean[] finished; // 해당 노드 DFS가 끝났는지 - static int teamCount; // 팀에 속한 학생 수 + + static int N, M; + static int[][] water; + static boolean[][] cloud; + + static final int[] dx = {0, 0, -1, -1, -1, 0, 1, 1, 1}; + static final int[] dy = {0, -1, -1, 0, 1, 1, 1, 0, -1}; + + // 대각선 4방향 (물복사버그) + static final int[] diagX = {-1, -1, 1, 1}; + static final int[] diagY = {-1, 1, -1, 1}; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - StringBuilder sb = new StringBuilder(); - - int T = Integer.parseInt(br.readLine()); - while (T-- > 0) { - n = Integer.parseInt(br.readLine()); - select = new int[n + 1]; - visited = new boolean[n + 1]; - finished = new boolean[n + 1]; - teamCount = 0; - - StringTokenizer st = new StringTokenizer(br.readLine()); - for (int i = 1; i <= n; i++) { - select[i] = Integer.parseInt(st.nextToken()); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + + water = new int[N][N]; + + // 초기 물 + for (int r = 0; r < N; r++) { + st = new StringTokenizer(br.readLine()); + for (int c = 0; c < N; c++) { + water[r][c] = Integer.parseInt(st.nextToken()); } + } + + // 초기 구름 + cloud = new boolean[N][N]; + cloud[N - 1][0] = true; + cloud[N - 1][1] = true; + cloud[N - 2][0] = true; + cloud[N - 2][1] = true; + + // M번 이동 + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + int direction = Integer.parseInt(st.nextToken()); + int steps = Integer.parseInt(st.nextToken()); + + moveCloud(direction, steps); + rain(); + waterCopyBug(); + createNewCloud(); + } + + // 최종 물의 양 합 출력 + System.out.println(getTotalWater()); + } + + /** + * 1. 구름 이동 + */ + static void moveCloud(int direction, int steps) { + boolean[][] newCloud = new boolean[N][N]; + int move = steps % N; // N의 배수번 이동하면 제자리 + + for (int r = 0; r < N; r++) { + for (int c = 0; c < N; c++) { + if (cloud[r][c]) { + int nr = (r + dx[direction] * move) % N; + int nc = (c + dy[direction] * move) % N; + + // 양수 보정 + if (nr < 0) + nr += N; + if (nc < 0) + nc += N; - for (int i = 1; i <= n; i++) { - if (!visited[i]) { - dfs(i); + newCloud[nr][nc] = true; } } + } + cloud = newCloud; + } - sb.append(n - teamCount).append('\n'); + /** + * 2. 비 내림 (구름이 있는 칸의 물 +1) + */ + static void rain() { + for (int r = 0; r < N; r++) { + for (int c = 0; c < N; c++) { + if (cloud[r][c]) { + water[r][c]++; + } + } } - System.out.print(sb); } - static void dfs(int node) { - visited[node] = true; - int next = select[node]; + /** + * 3. 물복사버그 + * - 구름이 있던 칸에서 대각선 4칸 중 물이 있는 칸 개수만큼 물 증가 + */ + static void waterCopyBug() { + for (int r = 0; r < N; r++) { + for (int c = 0; c < N; c++) { + if (cloud[r][c]) { + int count = 0; - if (!visited[next]) { - dfs(next); - } else if (!finished[next]) { - teamCount += countCycle(next); + for (int k = 0; k < 4; k++) { + int nr = r + diagX[k]; + int nc = c + diagY[k]; + + if (nr >= 0 && nr < N && nc >= 0 && nc < N) { + if (water[nr][nc] > 0) { + count++; + } + } + } + + water[r][c] += count; + } + } } + } + + /** + * 4. 새로운 구름 생성 + * - 물이 2 이상인 칸에 새 구름 생성하고 물 2 줄임 + * - 직전에 구름이 있던 칸은 제외 + */ + static void createNewCloud() { + boolean[][] newCloud = new boolean[N][N]; - finished[node] = true; + for (int r = 0; r < N; r++) { + for (int c = 0; c < N; c++) { + if (!cloud[r][c] && water[r][c] >= 2) { + water[r][c] -= 2; + newCloud[r][c] = true; + } + } + } + + cloud = newCloud; } - static int countCycle(int start) { - int count = 1; - for (int i = select[start]; i != start; i = select[i]) { - count++; + /** + * 현재 전체 물 양 합산 + */ + static int getTotalWater() { + int sum = 0; + for (int r = 0; r < N; r++) { + for (int c = 0; c < N; c++) { + sum += water[r][c]; + } } - return count; + return sum; } -} \ No newline at end of file +} From d75130b9c0165f8dcddb3c7151303f0e1961a4a4 Mon Sep 17 00:00:00 2001 From: leelise Date: Sat, 9 Aug 2025 09:10:16 +0900 Subject: [PATCH 10/11] =?UTF-8?q?8/9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\354\233\220\354\210\255\354\235\264.java" | 80 +++++++++++++ Main.java | 110 +++++++++++------- ...\352\265\264\353\246\254\352\270\260.java" | 85 ++++++++++++++ 3 files changed, 230 insertions(+), 45 deletions(-) create mode 100644 "BFS/1600-\353\247\220\354\235\264\353\220\230\352\263\240\355\224\210\354\233\220\354\210\255\354\235\264.java" create mode 100644 "Simulation/14999-\354\243\274\354\202\254\354\234\204\352\265\264\353\246\254\352\270\260.java" diff --git "a/BFS/1600-\353\247\220\354\235\264\353\220\230\352\263\240\355\224\210\354\233\220\354\210\255\354\235\264.java" "b/BFS/1600-\353\247\220\354\235\264\353\220\230\352\263\240\355\224\210\354\233\220\354\210\255\354\235\264.java" new file mode 100644 index 0000000..eb1750e --- /dev/null +++ "b/BFS/1600-\353\247\220\354\235\264\353\220\230\352\263\240\355\224\210\354\233\220\354\210\255\354\235\264.java" @@ -0,0 +1,80 @@ +import java.io.*; +import java.util.*; + +public class Main { + static class Node { + int r, c, k; + Node(int r, int c, int k) { this.r = r; this.c = c; this.k = k; } + } + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int K = Integer.parseInt(br.readLine().trim()); + StringTokenizer st = new StringTokenizer(br.readLine()); + int W = Integer.parseInt(st.nextToken()); + int H = Integer.parseInt(st.nextToken()); + + int[][] map = new int[H][W]; + for (int i = 0; i < H; i++) { + st = new StringTokenizer(br.readLine()); + for (int j = 0; j < W; j++) { + map[i][j] = Integer.parseInt(st.nextToken()); + } + } + + // 나이트(말) 이동 8방 + int[] kr = {-2,-2,-1,-1,1,1,2,2}; + int[] kc = {-1,1,-2,2,-2,2,-1,1}; + // 인접 4방 (상하좌우) + int[] dr = {-1,1,0,0}; + int[] dc = {0,0,-1,1}; + + // dist[k][r][c] = 해당 상태에 도달하는 최소 동작수, -1이면 미방문 + int[][][] dist = new int[K+1][H][W]; + for (int k = 0; k <= K; k++) { + for (int i = 0; i < H; i++) Arrays.fill(dist[k][i], -1); + } + + ArrayDeque q = new ArrayDeque<>(); + dist[0][0][0] = 0; + q.offer(new Node(0, 0, 0)); + + while (!q.isEmpty()) { + Node cur = q.poll(); + int r = cur.r, c = cur.c, used = cur.k; + int curDist = dist[used][r][c]; + + // 인접 4방 이동 + for (int d = 0; d < 4; d++) { + int nr = r + dr[d], nc = c + dc[d]; + if (nr < 0 || nr >= H || nc < 0 || nc >= W) continue; + if (map[nr][nc] == 1) continue; // 장애물 + if (dist[used][nr][nc] == -1) { + dist[used][nr][nc] = curDist + 1; + q.offer(new Node(nr, nc, used)); + } + } + + // 말(나이트) 이동 — 사용 한도 남아있을 때만 + if (used < K) { + for (int d = 0; d < 8; d++) { + int nr = r + kr[d], nc = c + kc[d]; + if (nr < 0 || nr >= H || nc < 0 || nc >= W) continue; + if (map[nr][nc] == 1) continue; + if (dist[used + 1][nr][nc] == -1) { + dist[used + 1][nr][nc] = curDist + 1; + q.offer(new Node(nr, nc, used + 1)); + } + } + } + } + + int ans = Integer.MAX_VALUE; + for (int k = 0; k <= K; k++) { + int d = dist[k][H-1][W-1]; + if (d != -1 && d < ans) ans = d; + } + + System.out.println(ans == Integer.MAX_VALUE ? -1 : ans); + } +} diff --git a/Main.java b/Main.java index 016e797..eb1750e 100644 --- a/Main.java +++ b/Main.java @@ -1,60 +1,80 @@ -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.util.StringTokenizer; +import java.io.*; +import java.util.*; public class Main { - static int n; - static int[] select; // 각 학생이 선택한 학생 - static boolean[] visited; // DFS 방문 여부 - static boolean[] finished; // 해당 노드 DFS가 끝났는지 - static int teamCount; // 팀에 속한 학생 수 + static class Node { + int r, c, k; + Node(int r, int c, int k) { this.r = r; this.c = c; this.k = k; } + } public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - StringBuilder sb = new StringBuilder(); - - int T = Integer.parseInt(br.readLine()); - while (T-- > 0) { - n = Integer.parseInt(br.readLine()); - select = new int[n + 1]; - visited = new boolean[n + 1]; - finished = new boolean[n + 1]; - teamCount = 0; - - StringTokenizer st = new StringTokenizer(br.readLine()); - for (int i = 1; i <= n; i++) { - select[i] = Integer.parseInt(st.nextToken()); - } + int K = Integer.parseInt(br.readLine().trim()); + StringTokenizer st = new StringTokenizer(br.readLine()); + int W = Integer.parseInt(st.nextToken()); + int H = Integer.parseInt(st.nextToken()); - for (int i = 1; i <= n; i++) { - if (!visited[i]) { - dfs(i); - } + int[][] map = new int[H][W]; + for (int i = 0; i < H; i++) { + st = new StringTokenizer(br.readLine()); + for (int j = 0; j < W; j++) { + map[i][j] = Integer.parseInt(st.nextToken()); } - - sb.append(n - teamCount).append('\n'); } - System.out.print(sb); - } - static void dfs(int node) { - visited[node] = true; - int next = select[node]; + // 나이트(말) 이동 8방 + int[] kr = {-2,-2,-1,-1,1,1,2,2}; + int[] kc = {-1,1,-2,2,-2,2,-1,1}; + // 인접 4방 (상하좌우) + int[] dr = {-1,1,0,0}; + int[] dc = {0,0,-1,1}; - if (!visited[next]) { - dfs(next); - } else if (!finished[next]) { - teamCount += countCycle(next); + // dist[k][r][c] = 해당 상태에 도달하는 최소 동작수, -1이면 미방문 + int[][][] dist = new int[K+1][H][W]; + for (int k = 0; k <= K; k++) { + for (int i = 0; i < H; i++) Arrays.fill(dist[k][i], -1); } - finished[node] = true; - } + ArrayDeque q = new ArrayDeque<>(); + dist[0][0][0] = 0; + q.offer(new Node(0, 0, 0)); - static int countCycle(int start) { - int count = 1; - for (int i = select[start]; i != start; i = select[i]) { - count++; + while (!q.isEmpty()) { + Node cur = q.poll(); + int r = cur.r, c = cur.c, used = cur.k; + int curDist = dist[used][r][c]; + + // 인접 4방 이동 + for (int d = 0; d < 4; d++) { + int nr = r + dr[d], nc = c + dc[d]; + if (nr < 0 || nr >= H || nc < 0 || nc >= W) continue; + if (map[nr][nc] == 1) continue; // 장애물 + if (dist[used][nr][nc] == -1) { + dist[used][nr][nc] = curDist + 1; + q.offer(new Node(nr, nc, used)); + } + } + + // 말(나이트) 이동 — 사용 한도 남아있을 때만 + if (used < K) { + for (int d = 0; d < 8; d++) { + int nr = r + kr[d], nc = c + kc[d]; + if (nr < 0 || nr >= H || nc < 0 || nc >= W) continue; + if (map[nr][nc] == 1) continue; + if (dist[used + 1][nr][nc] == -1) { + dist[used + 1][nr][nc] = curDist + 1; + q.offer(new Node(nr, nc, used + 1)); + } + } + } } - return count; + + int ans = Integer.MAX_VALUE; + for (int k = 0; k <= K; k++) { + int d = dist[k][H-1][W-1]; + if (d != -1 && d < ans) ans = d; + } + + System.out.println(ans == Integer.MAX_VALUE ? -1 : ans); } -} \ No newline at end of file +} diff --git "a/Simulation/14999-\354\243\274\354\202\254\354\234\204\352\265\264\353\246\254\352\270\260.java" "b/Simulation/14999-\354\243\274\354\202\254\354\234\204\352\265\264\353\246\254\352\270\260.java" new file mode 100644 index 0000000..0da6f76 --- /dev/null +++ "b/Simulation/14999-\354\243\274\354\202\254\354\234\204\352\265\264\353\246\254\352\270\260.java" @@ -0,0 +1,85 @@ +import java.io.*; +import java.util.*; + +public class Main { + static int N, M, x, y, K; + static int[][] map; + static int[] dice = new int[7]; + // 동서북남 + // 문제가 1,2,3,4 순서대로 동서북남 + static int[] dx = {0, 0, 0, -1, 1}; + static int[] dy = {0, 1, -1, 0, 0}; + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + x = Integer.parseInt(st.nextToken()); + y = Integer.parseInt(st.nextToken()); + K = 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()); + } + } + + st = new StringTokenizer(br.readLine()); + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < K; i++) { + int cmd = Integer.parseInt(st.nextToken()); + int nx = x + dx[cmd]; + int ny = y + dy[cmd]; + + //범위 밖으로 가는 명령은 무시 + if (nx < 0 || nx >= N || ny < 0 || ny >= M) { + continue; + } + + roll(cmd); + x = nx; + y = ny; + + if (map[x][y] == 0) { + map[x][y] = dice[6]; + } else { + // 바닥 = 지도 위 값 + dice[6] = map[x][y]; + map[x][y] = 0; + } + sb.append(dice[1]).append("\n"); + } + System.out.print(sb); + } + + static void roll(int dir) { + int[] tmp = dice.clone(); + // 1 동쪽, 2 서쪽, 3 북쪽, 4 남쪽 + if (dir == 1) { + dice[1] = tmp[4]; + dice[3] = tmp[1]; + dice[6] = tmp[3]; + dice[4] = tmp[6]; + } else if (dir == 2) { + dice[1] = tmp[3]; + dice[4] = tmp[1]; + dice[6] = tmp[4]; + dice[3] = tmp[6]; + } else if (dir == 3) { + dice[1] = tmp[5]; + dice[2] = tmp[1]; + dice[6] = tmp[2]; + dice[5] = tmp[6]; + } else if (dir == 4) { + dice[1] = tmp[2]; + dice[5] = tmp[1]; + dice[6] = tmp[5]; + dice[2] = tmp[6]; + } + } +} From 8bffe4081b143be7b991ea65b3dcebf3e8763b19 Mon Sep 17 00:00:00 2001 From: Ansik Jung Date: Sat, 9 Aug 2025 10:23:55 +0900 Subject: [PATCH 11/11] =?UTF-8?q?fix:=20=EC=98=A4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\202\254\354\234\204\352\265\264\353\246\254\352\270\260.java" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "Simulation/14999-\354\243\274\354\202\254\354\234\204\352\265\264\353\246\254\352\270\260.java" => "Simulation/14499-\354\243\274\354\202\254\354\234\204\352\265\264\353\246\254\352\270\260.java" (100%) diff --git "a/Simulation/14999-\354\243\274\354\202\254\354\234\204\352\265\264\353\246\254\352\270\260.java" "b/Simulation/14499-\354\243\274\354\202\254\354\234\204\352\265\264\353\246\254\352\270\260.java" similarity index 100% rename from "Simulation/14999-\354\243\274\354\202\254\354\234\204\352\265\264\353\246\254\352\270\260.java" rename to "Simulation/14499-\354\243\274\354\202\254\354\234\204\352\265\264\353\246\254\352\270\260.java"