[Java]알고리즘

박진우·2022년 9월 29일
0

알고리즘 기초

목록 보기
2/29

1406 에디터

문제

한 줄로 된 간단한 에디터를 구현하려고 한다. 이 편집기는 영어 소문자만을 기록할 수 있는 편집기로, 최대 600,000글자까지 입력할 수 있다.

이 편집기에는 '커서'라는 것이 있는데, 커서는 문장의 맨 앞(첫 번째 문자의 왼쪽), 문장의 맨 뒤(마지막 문자의 오른쪽), 또는 문장 중간 임의의 곳(모든 연속된 두 문자 사이)에 위치할 수 있다. 즉 길이가 L인 문자열이 현재 편집기에 입력되어 있으면, 커서가 위치할 수 있는 곳은 L+1가지 경우가 있다.

이 편집기가 지원하는 명령어는 다음과 같다.

L 커서를 왼쪽으로 한 칸 옮김 (커서가 문장의 맨 앞이면 무시됨)
D 커서를 오른쪽으로 한 칸 옮김 (커서가 문장의 맨 뒤이면 무시됨)
B 커서 왼쪽에 있는 문자를 삭제함 (커서가 문장의 맨 앞이면 무시됨)
삭제로 인해 커서는 한 칸 왼쪽으로 이동한 것처럼 나타나지만, 실제로 커서의 오른쪽에 있던 문자는 그대로임
P $ $라는 문자를 커서 왼쪽에 추가함

초기에 편집기에 입력되어 있는 문자열이 주어지고, 그 이후 입력한 명령어가 차례로 주어졌을 때, 모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 구하는 프로그램을 작성하시오. 단, 명령어가 수행되기 전에 커서는 문장의 맨 뒤에 위치하고 있다고 한다.

입력

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수를 나타내는 정수 M(1 ≤ M ≤ 500,000)이 주어진다. 셋째 줄부터 M개의 줄에 걸쳐 입력할 명령어가 순서대로 주어진다. 명령어는 위의 네 가지 중 하나의 형태로만 주어진다.

출력

첫째 줄에 모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 출력한다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;

 
public class B_1406 {


	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		String str = br.readLine();

		int M = Integer.parseInt(br.readLine());

 		Stack<String> leftSt = new Stack<String>();
		Stack<String> rightSt = new Stack<String>();
      
		String[] arr = str.split("");

		for(String s : arr) { 

			leftSt.push(s); 

		}
		
		for(int i = 0; i < M; i++) {

			String command = br.readLine();

			char c = command.charAt(0);
		
			switch(c) {

			case 'L':

				if(!leftSt.isEmpty())

					rightSt.push(leftSt.pop());


				break;

			case 'D':

				if(!rightSt.isEmpty())

					leftSt.push(rightSt.pop());

 

				break;

			case 'B':

				if(!leftSt.isEmpty()) {

					leftSt.pop();
				}

				break;

			case 'P':

				char t = command.charAt(2);

				leftSt.push(String.valueOf(t));

				break;

			default:

				break;

			}

		}

		while(!leftSt.isEmpty())

			rightSt.push(leftSt.pop());

		while(!rightSt.isEmpty())

			bw.write(rightSt.pop());

		bw.flush();

		bw.close(); 

	}

}

10845 큐

문제

정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 여섯 가지이다.

push X: 정수 X를 큐에 넣는 연산이다.
pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
size: 큐에 들어있는 정수의 개수를 출력한다.
empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

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 B_10845 {

	public static void main(String[] args) throws NumberFormatException, IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int N = Integer.parseInt(br.readLine());

		StringBuilder sb = new StringBuilder();

		Queue<Integer> Q = 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());

				Q.offer(last);

				break;

			case"pop":

				if(Q.isEmpty()) sb.append(-1).append("\n");

				else sb.append(Q.poll()).append("\n");

				break;

			case "size" :

				sb.append(Q.size()).append("\n");

				break;

			case "empty" :

				if(Q.isEmpty()) sb.append(1).append("\n");

				else sb.append(0).append("\n");

				break;

			case "front" :

				if(Q.isEmpty()) sb.append(-1).append("\n");

				else sb.append(Q.peek()).append("\n");

				break;

			case "back" :

				if(Q.isEmpty()) sb.append(-1).append("\n");

				else sb.append(last).append("\n");

				break;

			default:

				break;
			}
		}
		System.out.println(sb);
	}
}

1158 요세푸스 문제

문제

요세푸스 문제는 다음과 같다.

1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.

N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

출력

예제와 같이 요세푸스 순열을 출력한다.

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 B_1158 {
	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());
		int K = Integer.parseInt(st.nextToken());
		Queue<Integer> Q = new LinkedList<Integer>();
		for(int i = 1;i<=N;i++) {
			Q.offer(i);
		}
		StringBuilder sb = new StringBuilder();
		sb.append("<");
		while(Q.size() != 1) {
			for(int i = 0;i<K-1;i++) {
				Q.offer(Q.poll());
			}
			sb.append(Q.poll()).append(", ");
		}
		sb.append(Q.poll()).append(">");
		System.out.println(sb);
	}
}

10866 덱

문제

정수를 저장하는 덱(Deque)를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 여덟 가지이다.

push_front X: 정수 X를 덱의 앞에 넣는다.
push_back X: 정수 X를 덱의 뒤에 넣는다.
pop_front: 덱의 가장 앞에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
pop_back: 덱의 가장 뒤에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
size: 덱에 들어있는 정수의 개수를 출력한다.
empty: 덱이 비어있으면 1을, 아니면 0을 출력한다.
front: 덱의 가장 앞에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
back: 덱의 가장 뒤에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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));
		int N = Integer.parseInt(br.readLine());
		StringBuilder sb = new StringBuilder();
		Deque<Integer> deq = new ArrayDeque<Integer>();
		
		for(int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			String S = st.nextToken();
			
			switch (S) {
			case "push_front" :
				deq.addFirst(Integer.parseInt(st.nextToken()));
				break;
			case "push_back" :
				deq.addLast(Integer.parseInt(st.nextToken()));
				break;
			case "pop_front" :
				if(deq.isEmpty()) sb.append(-1).append("\n");
				else sb.append(deq.pollFirst()).append("\n");
				break;
			case "pop_back" :
				if(deq.isEmpty()) sb.append(-1).append("\n");
				else sb.append(deq.pollLast()).append("\n");
				break;
			case "size" :
				sb.append(deq.size()).append("\n");
				break;
			case "empty" :
				if(deq.isEmpty()) sb.append(1).append("\n");
				else sb.append(0).append("\n");
				break;
			case "front" :
				if(deq.isEmpty()) sb.append(-1).append("\n");
				else sb.append(deq.peekFirst()).append("\n");
				break;
			case "back" :
				if(deq.isEmpty()) sb.append(-1).append("\n");
				else sb.append(deq.peekLast()).append("\n");
				break;
			}
		}
		System.out.println(sb);
	}

}
profile
개발자를 꿈꾸는 사람입니다

0개의 댓글