문제 해석
- 문제를 이해하는데 진짜 오랜 시간이 걸렸다...
- 내가 생각하기에 하나의 원소를 가지는 자료구조라는 것이 중요한 포인트 같다.
- 처음엔 배열이 보이니까 한 배열이 자료구조 하나인 게 더 익숙하다보니 그런 식으로 해석하려하니 꽤 헤맸다.
- 암튼, 문제 해석하자면 아래의 같다.
- 첫째 줄에 자료구조의 개수 N개를 입력받는다.
- 두번째 줄에는 N개 만큼 각각 하나의 원소를 가지는 자료구조 형태를 입력받는다.
- 0 : queue (큐; FIFO)
- 1 : stack (스택; LIFO)
- 세번째 줄에는 각각 자리에 해당하는 하나의 원소(수)를 가지는 자료구조들이 가지고 있는 원소들을 입력받는다. (예를 들어 1 2 3 4 -> 첫번째 자료구조가 가지는 원소는 1이 되는 것이다.)
- 네번째 줄에는 각각 자리에 해당하는 자료구조들에게 각각 들어갈 원소의 개수이고, 다섯번째줄부터는 첫번째 자료구조에 들어가는 원소들을 입력받는다.
- 그 후로는 첫번째 자료구조에서 POP된 원소를 다음 자료구조에 넣어준다. (이 과정을 N번만큼 반복)
- 간단하게 설명하자면 아래와 같다.
- 단!!! 마지막 Xn의 리턴 값을 출력한다.
코드
1
import java.io.*;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
LinkedList<Structure> queueStack = new LinkedList<>();
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++){
queueStack.addLast(new Structure(Integer.parseInt(st.nextToken()), 0));
}
st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++){
queueStack.get(i).setValue(Integer.parseInt(st.nextToken()));
}
int M = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
br.close();
while(M --> 0){
int moveValue = Integer.parseInt(st.nextToken());
for(int i = 0; i< N; i++){
if(queueStack.get(i).getType() == 0){
int tmpValue = queueStack.get(i).getValue();
queueStack.get(i).setValue(moveValue);
moveValue = tmpValue;
}
}
sb.append(moveValue).append(" ");
}
System.out.println(sb);
}
}
class Structure{
int type;
int value;
public Structure(int type, int value) {
this.type = type;
this.value = value;
}
public void setType(int type) {
this.type = type;
}
public void setValue(int value) {
this.value = value;
}
public int getType() {
return type;
}
public int getValue() {
return value;
}
}
- 시간초과가 나왔다 while -> for문으로 O(N^2)의 시간복잡도를 가지는데 이로 인해 시간초과가 나오는 것 같다. 입력 값이 100 000, 1 000 000 000 이기 때문에... 시간초과가 나올 것인게 확실했는데 생각을 못했다...
2
import java.io.*;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
int[] typeArr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++){
typeArr[i] = Integer.parseInt(st.nextToken());
}
Deque<Integer> deque = new ArrayDeque<>();
st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++){
int num = Integer.parseInt(st.nextToken());
if(typeArr[i] == 0){
deque.addLast(num);
}
}
int M = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
br.close();
while(M --> 0){
int moveValue = Integer.parseInt(st.nextToken());
deque.addFirst(moveValue);
sb.append(deque.pollLast()).append(" ");
}
System.out.println(sb);
}
}
- 큐인 것만 저장했다. (그랬더니 따로 큐인지 스택인지 비교해야하는 로직을 지울 수 있었고 그로 인해 이중반복문을 지울 수 있었다.)
결과
1
2
느낀 점
- 처음에는 문제 해석하는데 있어서 많이 헤맸지만 그래도 풀고나니 진짜 문제해석만큼 어려운 문제는 아니라는 생각이 들었다. (생각보다 쉬운 문제였다..ㅎㅎ)
막혔었는데 올려주신 풀이 참고해서 해결했습니다. 감사합니다!