알고리즘 문제풀이 9

[백준 21608 JAVA] 상어 초등학교 : 조건 잘 구현하기

어떠한 알고리즘이 아닌 구현쪽 문제를 풀어보았다. 주어진 조건에 맞추어 주어진 예시 및 구글링해서 나오는 반례들을 모두 넣어서 맞는 값을 도출해내었다. 그러나 백준 제출에는 계속 틀렸습니다가 떠서 문제를 새로 풀었다. (가장 아래에 틀리지만 답은 제대로 나오는 코드를 추가하겠다) 이리 장황한 문제는 일단 문제를 읽고 어떻게 구현할지를 우선 생각하는 것이 아니라 예시를 정확하게 이해하는 것이 중요하다고 느꼈다. 고려한 점 아래 수식은 대각선 방향을 허용하지 않는 상,하,좌,우만을 의미한다. => 주변 = 상,하,좌,우 |r1 - r2| + |c1 - c2| = 1 3개의 조건을 순서대로 코드로 풀어내면 되었다. import java.util.*; public class Main { static int[] ..

[백준 - 14891 JAVA] 톱니바퀴 : 재귀 사용

일단 문제가 너무 장황해서 보기 어려웠지만 하나씩 이해하고자 하니 괜찮았다. 그러나 주어진 그림 예시에서는 하나가 움직이면 연쇄적으로 움직여야하는 상황에 대해 캐치하지 못하였어서 예시 4번에서 계속 원하는 값이 나오지 않았다. (이때까지는 재귀 생각 못함) 그래서 질문 게시판을 보니 연쇄적으로 움직이는 상황도 생각해야한다고 하여 재귀로 풀기로 결심하였다. 고려사항 모든 경우의 수에 맞춰 if문을 작성했다가 너무 코드가 복잡해지고 생각 못한 조건에 대해 커버를 하지 못해 재귀로 변경 1 base가 아니라 0 base 라서 시작시 wheelNum - 1 로 진행 방문했다는 visited를 사용해야만 문제가 해결 되었다. 해당 톱니바퀴를 돌리고자 했었다 라는 표시를 해둬야 연쇄적으로 돌아가야하는 재귀에서 돌아..

[백준 - 10799 JAVA] 쇠막대기 : Stack 사용

생각보다 오래걸린 문제! 스택을 활용하여 풀면 간단하게 풀릴것이라 생각했지만 레이저의 개수를 직접 세어 막대기의 갯수를 세아리려고 하니 재귀함수 까지 생각이 닿았지만 그럴 필요는 없었음 고려사항 주어진 그림을 가로로만 봐서 어려웠는데, 세로로 보니 답이 보였음 레이저가 발견되면 스택에 쌓여있는 갯수만큼 잘린다 -> 그만큼 더하면됨 열린 괄호를 만나면 스택에 넣고, 직전 글자를 확인하여 레이저 이면 pop시키고 토탈 카운트를 누적 연산 레이저가 아닌 닫힌 괄호는 해당 막대기의 마무리에 대한 연산은 없었기 때문에 마지막 조각을 더해준다(+1) import java.util.*; import java.io.*; public class Main { public static void main(String[] ar..

[백준 - 3273 JAVA] 두 수의 합 : set 2개 사용

주어진 문제의 조건이 서로 다른 양의 정수였기 때문에 중복 고려를 하지 않아도 되고, 이미 한번 연산한 내용에대해서는 따로 체크할 필요가 없기때문에 Contains 의 시간복잡도가 O(1)인 Set을 사용하기로 하였다. Set중 HashSet은 중복 저장하지않고, 순서 없이 저장되지만 속도는 빠르기때문에 자바로 문제푸는 본인은 set을 사용하기로 선택! 고려사항 첫번째 입력값으로 주어지는 정수 갯수는...의미가 없었음 -> 한줄로 들어오는 입력 값을 Tokenizer 를 사용하여 분리했음 결국엔 (finalNum - 현재 정수) 가 입력된 수열안에 있기만 하면 카운트 증가 대신 체크한 정수인지 확인하기위해 set을 하나 더 사용하여, 체크된 정수는 set에 저장하여 while 문 안에서 Contains로..

[백준 - 4949 JAVA] 균형잡힌 세상 : 스택 잘 사용하기

문제에 입력되는 영어 소문자들도 균형을 맞춰라 라고하는 느낌이 있어서 헤매다가 silver 등급의 문제길래 신경쓰지않았다. 신경썼던 부분이 stack을 static으로 전역에 선언했기 때문에 clear를 잊지않고 해줬어야했다. 입력된 모든 문자열을 검사 한 이후에 문제가 없었을 경우 스택이 비어있지 않았다면 실패로 간주 : 여는 괄호 하나만 넣으면 verifyBlank 함수에서 못걸러내기 때문 import java.util.*; import java.io.*; public class Main { static Stack stack = new Stack(); public static void main(String[] agrs) throws Exception { BufferedReader br = new Bu..

[백준 - 2446 Java] 별찍기 9

머리 식히기 용 별찍기! 자바 11에도 "*".repeat(4)이 되어서 편하게 풀었음 package beakjoon.bronze.b2446; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int num = Integer.parseInt(scanner.nextLine()); int size = num - 1; for (int i = size; i >= 0; i--) { int repeat = 2 * i + 1; String s = "*".repeat(repeat); String blank = " ".repeat(num - ..

[백준 - 10828 Java] 스택

기본적인 스택 문제였다. 그냥 스택을 쓰면 되는 문제였겠지..? 배열을 썼어야한건가... 일단 통과 import java.util.*; import java.io.*; public class Main { static Stack stack = new Stack(); public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int count = Integer.parseInt(br.readLine()); for (int i = 0; i < count; i++) { int num = myStack(br.readLine()); if (n..

[백준 - 10808 Java] 알파벳 개수

단순한 문자 개수 세기 문제였다. import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String s = scanner.nextLine(); char[] chars = s.toCharArray(); int[] result = new int[26]; for (char aChar : chars) { result[(aChar - 'a')]++; } for (int i : result) { System.out.print(i + " "); } } } Character 는 int로도 따로 캐스팅 필요 없이 치환이 가능하다. ('a' -> 97) 고로..

[백준 - 1406 Java] 에디터

실버 2의 문제로 자료구조를 어떻게 사용하는지를 익힐 수 있는 문제였다. 주어진 문제에서 문자를 삽입하고, 삭제하는 조건들이 있어 LinkedList를 사용하면 찰떡이라고 생각해서 문제를 풀었다. import java.util.*; import java.io.*; public class Main { static int cursor = 0; static List list = new LinkedList(); public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // Scanner scanner = new Scanner(Syste..