이번 문제는 매우 간단했다. import java.io.*; import java.util.ArrayDeque; import java.util.Deque; public class Q2161 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.parseInt(br.readLine()); Deque deque = new ArrayDeque(T); StringBuilder sb = new StringBuilder(); for(int i = 0; i < T; i++) { deque.offer(i..
이번 문제는 내가 풀었던 문제중에서 가장 억울했던 문제이다.. 이 문제를 풀면서 주의해야할 점을 얘기해보고자 한다. 우선 나는 처음에 이 코드를 풀기 위해서, Collections.reverse()를 이용하여 뒤집어서 하였다. 하지만 이 메서드를 사용하면 아시다시피, 자동으로 정렬이 되는 마법의 메서드가 아닌 사실 내부적으로 어떠한 로직을 통하여 배열을 역순 정렬하는 것이다. 따라서 입력값이 이번 문제처럼 큰 경우 시간초과가 무조건 날 것이다. 아래는 reverse의 실제 소스인데, 보다시피 반복문을 통해 정렬을 하게 되어있다. 따라서 시간초과가 날 수 밖에 없는 것이다. 아니 그럼 정렬을 하지 않고 어떻게 이걸 구현할 수 있을까? 예를 들어 RDD 1 2 3 4 >> 4321 >> 321 >> 21 이..
import java.io.*; import java.util.*; public class Q1021 { 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()), m = Integer.parseInt(st.nextToken()); Deque deque = new LinkedList(); int[] index = new int[m]; for(i..
이번엔 덱을 구현하는 문제이다. 우선 큐는 한쪽 방향만으로 추가/삭제 가능하다. 하지만 덱은 양쪽 끝에 추가 또는 삭제가 가능하다. 이 문제의 구현하는 방법은 단순히 기본적인 Deque의 개념만 알면 된다. import java.io.*; import java.util.Deque; import java.util.LinkedList; public class Q10866 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.valueOf(br.readLine()); Deque deque = n..
이번 문제는 시간 복잡도가 O(1)이어야 한다. O(1)이란 입력값의 크기에 상관없이 프로그램이 항상 일정한 시간에 실행되어야 한다는 조건이 있다. 이 조건을 알았다면, 문제를 다시 어떻게 해결해볼지 스스로 생각해보자. 이전에 큐 문제에선 약간 더럽게 작성했지만, 이번 문제를 해결하기 위해서 최대한 간략화하고, 메서드를 호출하는 것을 최소화하였다. import java.io.*; import java.util.Deque; import java.util.LinkedList; public class Q18258 { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputSt..
이런 문제를 처음 접해본 나에게 좀 어려웠던 문제이다. 이 문제의 요점은 Queue를 단순히 구현하는 것이 아닌, 각 데이터의 우선 순위도를 비교하여, 우선 순위도가 가장 높은 데이터라면 poll() 즉, 데이터를 제거하는데, 내가 찾으려는 문서와 일치하는 경우엔 이 문서가 몇번째로 빠져나갔는지 체킹을해야한다. 단, 현재 데이터의 우선 순위도가 현재 남은 데이터들의 최고 우선순위도 보다 낮다면, 출력하지 않고 맨 뒤로 보내야한다. 내가 작성한 코드는 아래와 같다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Q1966 { st..
이런 순열을 처음 접해봤지만, 절대 어려운 문제는 아니였다. 직전에 풀이했던 카드와 매우 유사하였다. 바로 코드를 보여주겠다. import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int K = sc.nextInt(); Queue queue = new LinkedList(); Set set = new LinkedHashSet(N); int tmp = 0; for(int i = 1; i
이번 문제는 큐에 대한 기본적인 구조를 알 수 있는 문제이다. 우선 문제에 대한 설명을 하자면, 카드의 총 갯수에서 가장 앞에 있는 카드는 버리고, 다음 장의 카드는 맨 뒤로 보내는 것이다. 바로 코드를 보여주겠다. package Algo.Queue; import java.io.*; import java.util.*; public class Q2164 { public static void main(String[] args) { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Queue queue = new LinkedList(); try { final int CARD_LENGTH = Integer.valueOf(br.re..
요즘 단계별 문제만 풀었더니 실력이 많이 늘지 않는 거 같아 오늘부터 중점적으로 실버 이상의 문제를 풀어보기로 했다. 첫 번째 문제는 큐 구현이다. 문제의 조건은 다음과 같다. 큐의 기본 개념에 대해 알고 있는 사람이라면, 위의 명령어들이 큐의 어떤 메서드와 유사한지 바로 눈치를 챌 수 있을 것이다. 한번 API를 살펴보자. 위의 6 메서드들은 모두 Queue에 정의된 메서드들이다. 하지만 비슷한 기능이 두 쌍이다. 약간 설명을 덧붙이자면 {add(), element(), remove()}, {offer(), peek(), poll()} 이렇게 나눌 수 있다. 첫 번째 케이스와 두 번째 케이스의 차이점은 간단히 말해서 예외 발생의 차이이다. add()는 저장 공간이 부족할 경우 IllegalStateEx..