-
[백준/BOJ] 10845번 : 큐 (JAVA / 자바)백준 2022. 3. 5. 16:35
안녕하세요~ 코딩하는 코알못 코메인입니다.
https://www.acmicpc.net/problem/10845
- 문제 -
난이도 실버 4 문제이다.
자바에서 입력방식은 scanner와 bufferedreader가 있다.
자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.
bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.
더 자세한 내용은 아래 글 참고 하면 좋다.
풀이 방법
https://comain.tistory.com/271
스택 문제, 그리고 다음에 올라올 덱 문제랑 같다. 알고리즘 문제를 풀다보면 심심찮게 쓰이는 스택, 큐, 덱을 사용하고, 구현해보는 것이다.
셋 다 배열로 구현을 할 것이고, 난이도는 스택이 제일 쉽고, 큐, 덱 순서이다. 하지만 스택 문제가 제일 문제 확률이 낮은데 아마 스택에서 매운맛을 다 보고 큐 덱으로 넘어가서 비교적 함정같은 걸 다 피해서 그런거 같다.
두가지 방법으로 풀 것이다.
1. 큐를 직접 가져다 쓰는 방법
2. 큐를 구현하는 방법
사실상 코드를 보면 크게 어렵지 않기 때문에 스택문제에서 말한 주의할 점만 생각하면 된다.
코드를 보자.
-풀이-
1. 큐를 그대로 사용
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); StringBuilder sb = new StringBuilder(); Queue<Integer> que = new LinkedList<Integer>(); int last = 0; for(int i = 0; i < N; i++) { StringTokenizer st = new StringTokenizer(br.readLine()); String S = st.nextToken(); switch(S) { case "push" : last = Integer.parseInt(st.nextToken()); que.offer(last); break; case "pop" : if(que.isEmpty()) sb.append(-1).append("\n"); else sb.append(que.poll()).append("\n"); break; case "size" : sb.append(que.size()).append("\n"); break; case "empty" : if(que.isEmpty()) sb.append(1).append("\n"); else sb.append(0).append("\n"); break; case "front" : if(que.isEmpty()) sb.append(-1).append("\n"); else sb.append(que.peek()).append("\n"); break; case "back" : if(que.isEmpty()) sb.append(-1).append("\n"); else sb.append(last).append("\n"); break; } } System.out.println(sb); } }
2. 큐를 구현
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { static int[] que = new int[10001]; //스택은 LIFO이기 때문에 size가 인덱스가 될 수 있었지만, //큐는 FIFO이기 때문에 저장된 값을 제외할때는 제일 앞의 값을 제외 시킨다. //하지만 주의할 건 그렇다고 0인덱스를 제외 시키면 안된다. 배열은 값을 제외시키는 개념이 없기 때문에 //0인덱스 값을 제외 시켰는데 다음 값을 또 제외 시키려면 0인덱스는 실제론 지워진 것이 아니라 그렇게 출력만 했기때문에 //0인덱스 다음인 1인덱스 값을 출력해야한다. 그걸 체크하기위한 first변수이다. static int first = 0; //last는 back이 입력 되었을때 마지막 인덱스에 저장된 값을 출력하기위한 변수이지만 스택문제의 size처럼 해도 된다. static int last = 0; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); StringBuilder sb = new StringBuilder(); for(int i = 0; i < N; i++) { StringTokenizer st = new StringTokenizer(br.readLine()); String S = st.nextToken(); switch(S) { case "push" : push(Integer.parseInt(st.nextToken())); break; case "pop" : sb.append(pop()).append("\n"); break; case "size" : sb.append(size()).append("\n"); break; case "empty" : sb.append(empty()).append("\n"); break; case "front" : sb.append(front()).append("\n"); break; case "back" : sb.append(back()).append("\n"); break; } } System.out.println(sb); } public static void push(int X) { que[last] = X; last++; } public static int pop() { if(last - first == 0) { return -1; }else { int P = que[first]; first++; return P; } } public static int size() { return last - first; } public static int empty() { if(last - first == 0) { return 1; }else { return 0; } } public static int front() { if(last - first == 0) { return -1; }else { int F = que[first]; return F; } } public static int back() { if(last - first == 0) { return -1; }else { int B = que[last - 1]; return B; } } }
-결과-
아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.
'백준' 카테고리의 다른 글
[백준/BOJ] 10989번 : 수 정렬하기 3 (JAVA / 자바) (0) 2022.03.05 [백준/BOJ] 10866번 : 덱 (JAVA / 자바) (0) 2022.03.05 [백준/BOJ] 10828번 : 스택 (JAVA / 자바) (0) 2022.03.03 [백준/BOJ] 10816번 : 숫자 카드 2 (JAVA / 자바) (0) 2022.03.03 [백준/BOJ] 10773번 : 제로 (JAVA / 자바) (0) 2022.03.01