개요와 목적
코딩 테스트 대표적인 스택 큐 문제들을 풀어보고,
스택 큐의 문제 풀이 방식에 대해서 알아본다.
후위식 연산
352+*9-
풀이
후위식이란, 연산만 뒤로 뺀 것이다.
예를 들어 5 -3 은 5 3 - 이렇게 표현한다.
3 5 2 + * 9 -
에서 숫자를 만나면 스택에 넣고, 연산자를 만나면 처음 숫자는 rt로 그 다음 숫자는 lt로 pop해서 알아온다. 그리고 lt 연산자 rt (5+2) 결과를 계산해서, 다시 스택에 넣는다. 이 동작을 반복해서 최종 연산 결과를 구한다.
import java.util.Scanner;
import java.util.Stack;
public class 후위식연산 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String next = sc.next();
char[] chars = next.toCharArray();
Stack<Integer> stack = new Stack<>();
for (char x : chars) {
if(Character.isDigit(x)){
stack.push(x-48);
}
else{
int rt=stack.pop();
int lt=stack.pop();
if(x=='+') stack.push(lt+rt);
else if(x=='-') stack.push(lt-rt);
else if(x=='*') stack.push(lt*rt);
else if(x=='/') stack.push(lt/rt);
}
}
System.out.println(stack.get(0));
}
}
쇠막대기
풀이
public class 쇠막대기 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String next = sc.next();
//먼저 ()를 .으로 바꿔서 표현하자
String str = next.replace("()", "_");
char[] chars = str.toCharArray();
Stack<Character> stack = new Stack<>();
// ( 를 만나면, stack에 추가하기
// _ 레이저를 만나면 stack에 있는 개수만큼 answer에 플러스해주기
//) 를 만나면 stack에서 제일 위에 것 제거 후 answer +1 해주기
int answer = 0;
for (char aChar : chars) {
if (aChar == '_') {
answer += stack.size();
} else if (aChar == '(') {
stack.push(aChar);
} else {
stack.pop();
answer += 1;
}
}
System.out.println(answer);
}
}
공주 구하기
8 3
풀이
Que에 k-1 번 만큼 que.add(que.poll())을 해서 돌 수 있게 하고.
k번 째 수는 que.poll() 빼버린다. 이런 동작을 que에 값이 1개 남아 있을 때까지 반복 하면 된다.
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class 공주구하기 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
Queue<Integer> queue = new LinkedList<>();
for (int i = 1; i <= n; i++) {
queue.add(i);
}
while (queue.size()!=1) {
//k-1번 뺀다음 뒤에 다시 넣기
for (int i = 1; i < k; i++) {
queue.add(queue.poll());
}
//k번 째 수는 뻬머리기
queue.poll();
}
System.out.println(queue.poll());
}
}
교육 과정 설계
CBA CBDAGE
풀이
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class 교육과정설계 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String n = sc.next();
String t = sc.next();
Queue<Character> queue = new LinkedList<>();
for (char c : n.toCharArray()) {
queue.add(c);
}
String answer = "YES";
for (char x : t.toCharArray()) {
if (queue.contains(x)) {
//듣는 과목이 큐 안에 있다면
// 가장 큐의 맨 앞 과목이어야 한다.
if (x != queue.poll()) {
answer = "NO";
break;
}
}
}
//큐가 비어져 있지 않다. 필수 과목을 듣지 않았다
//그러면 NO 출력
if (!queue.isEmpty()) {
answer = "NO";
}
System.out.println(answer);
}
}
응급실
5 2
60 50 70 80 90
6 3
70 60 90 60 60 60
풀이
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class 응급실 {
static class Person{
int id;
int priority;
public Person(int id, int priority){
this.id=id;
this.priority=priority;
}
}
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
int m = kb.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = kb.nextInt();
}
int answer = 0;
Queue<Person> Q = new LinkedList<>();
for (int i = 0; i < n; i++) {
Q.offer(new Person(i, arr[i]));
}
while (!Q.isEmpty()) {
Person tmp = Q.poll();
for (Person x : Q) {
if (x.priority > tmp.priority) {
Q.offer(tmp);
tmp = null;
break;
}
}
if (tmp != null) {
answer++;
if (tmp.id == m) {
break;}
}
}
System.out.println(answer);
}
}
'자바 자료구조 알고리즘 > 해시, 셋 & 스택, 큐' 카테고리의 다른 글
코딩 테스트 Java Hash, Set 문제 풀이 (0) | 2023.05.06 |
---|