[백준/BOJ] 10845번 : 큐 (JAVA / 자바)
안녕하세요~ 코딩하는 코알못 코메인입니다.
https://www.acmicpc.net/problem/10845
10845번: 큐
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지
www.acmicpc.net
- 문제 -
난이도 실버 4 문제이다.
자바에서 입력방식은 scanner와 bufferedreader가 있다.
자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.
bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.
더 자세한 내용은 아래 글 참고 하면 좋다.
(JAVA / 자바) Scanner 와 Bufferedreader
안녕하세요~ 코딩하는 코알못 코메인입니다. 이번엔 백준 문제 풀면서 계속 언급될 scanner와 bufferedreader에 대한 간단한 정리를 해볼거다. 자바에서 입력은 scanner와 bufferedreader가 있다. 우선 각자
comain.tistory.com
풀이 방법
https://comain.tistory.com/271
[백준/BOJ] 10828번 : 스택 (JAVA / 자바)
안녕하세요~ 코딩하는 코알못 코메인입니다. https://www.acmicpc.net/problem/10828 10828번: 스택 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주.
comain.tistory.com
스택 문제, 그리고 다음에 올라올 덱 문제랑 같다. 알고리즘 문제를 풀다보면 심심찮게 쓰이는 스택, 큐, 덱을 사용하고, 구현해보는 것이다.
셋 다 배열로 구현을 할 것이고, 난이도는 스택이 제일 쉽고, 큐, 덱 순서이다. 하지만 스택 문제가 제일 문제 확률이 낮은데 아마 스택에서 매운맛을 다 보고 큐 덱으로 넘어가서 비교적 함정같은 걸 다 피해서 그런거 같다.
두가지 방법으로 풀 것이다.
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;
}
}
}
-결과-
아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.