import sysfrom collections import dequelines = sys.stdin.read().split("\n")n = int(lines[0])train = deque() # 앞뒤 어느 쪽에서도 넣고 빼는 데 O(1)out = []for cmd in lines[1:n + 1]: op, arg = cmd.split() k = int(arg) if op == "addf": train.appendleft(k) elif op == "addb": train.append(k) elif op in ("cutf", "cutb"): # 남은 차량보다 많이 떼라고 하면 있는 만큼만 뗀다(빈 deque에서 빼면 IndexError) take = min(k, len(train)) if op == "cutf": cut = [train.popleft() for _ in range(take)] else: cut = [train.pop() for _ in range(take)] # 뗀 차례: 맨 뒤 차량부터 out.append(" ".join(map(str, cut)) if cut else "-") elif op == "rot": train.rotate(-k) # 음수는 왼쪽으로: 앞의 것이 뒤로 간다(빈 deque는 그대로)out.append(str(len(train)))out.append(" ".join(map(str, train)) if train else "-")print("\n".join(out))
JavaMain.java · 44 行
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayDeque;import java.util.StringJoiner;public class Main { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(in.readLine().trim()); ArrayDeque<Integer> train = new ArrayDeque<>(); // 앞뒤 어느 쪽에서도 넣고 빼는 데 O(1) StringBuilder out = new StringBuilder(); for (int i = 0; i < n; i++) { String[] p = in.readLine().trim().split(" "); long k = Long.parseLong(p[1]); switch (p[0]) { case "addf" -> train.addFirst((int) k); case "addb" -> train.addLast((int) k); case "cutf", "cutb" -> { // 있는 만큼만 뗀다(빈 ArrayDeque에서 removeFirst·pop은 예외를 던진다) long take = Math.min(k, train.size()); StringJoiner cut = new StringJoiner(" "); for (long r = 0; r < take; r++) { int car = p[0].equals("cutf") ? train.pollFirst() : train.pollLast(); // 뒤는 맨 뒤 차량부터 cut.add(String.valueOf(car)); } out.append(take == 0 ? "-" : cut.toString()).append('\n'); } case "rot" -> { if (!train.isEmpty()) { long r = k % train.size(); // 한 바퀴 돌면 제자리다 for (long s = 0; s < r; s++) train.addLast(train.pollFirst()); } } default -> throw new IllegalArgumentException(p[0]); } } out.append(train.size()).append('\n'); StringJoiner items = new StringJoiner(" "); for (int x : train) items.add(String.valueOf(x)); // 앞에서 뒤로 돈다 out.append(train.isEmpty() ? "-" : items.toString()).append('\n'); System.out.print(out); }}
C#Main.cs · 51 行
using System;using System.Collections.Generic;using System.Text;class Program{ static void Main() { int n = int.Parse(Console.ReadLine()!.Trim()); // .NET에는 Deque가 없다. LinkedList<T>는 앞뒤에 넣고 빼는 데 O(1)이다 var train = new LinkedList<int>(); var output = new StringBuilder(); for (int i = 0; i < n; i++) { string[] p = Console.ReadLine()!.Trim().Split(' '); long k = long.Parse(p[1]); switch (p[0]) { case "addf": train.AddFirst((int)k); break; case "addb": train.AddLast((int)k); break; case "cutf": case "cutb": // 있는 만큼만 뗀다(비었는데 First를 읽으면 null이다) long take = Math.Min(k, train.Count); var cut = new List<int>(); for (long r = 0; r < take; r++) { if (p[0] == "cutf") { cut.Add(train.First!.Value); train.RemoveFirst(); } else { cut.Add(train.Last!.Value); train.RemoveLast(); } // 맨 뒤 차량부터 } output.Append(cut.Count == 0 ? "-" : string.Join(" ", cut)).Append('\n'); break; case "rot": if (train.Count > 0) { long r = k % train.Count; // 한 바퀴 돌면 제자리다 for (long s = 0; s < r; s++) { var node = train.First!; train.RemoveFirst(); train.AddLast(node); // 마디를 그대로 옮긴다 } } break; } } output.Append(train.Count).Append('\n'); output.Append(train.Count == 0 ? "-" : string.Join(" ", train)).Append('\n'); Console.Write(output); }}
C++main.cpp · 45 行
#include <algorithm>#include <deque>#include <iostream>#include <string>int main() { std::ios::sync_with_stdio(false); int n; std::cin >> n; std::deque<int> train; // 앞뒤 어느 쪽에서도 넣고 빼는 데 O(1) for (int i = 0; i < n; i++) { std::string op; long long k; std::cin >> op >> k; if (op == "addf") { train.push_front((int)k); } else if (op == "addb") { train.push_back((int)k); } else if (op == "cutf" || op == "cutb") { // 빈 deque에서 front()·pop_front()는 정의되지 않은 동작이라, 있는 만큼만 뗀다 long long take = std::min(k, (long long)train.size()); if (take == 0) std::cout << '-'; for (long long r = 0; r < take; r++) { if (r > 0) std::cout << ' '; if (op == "cutf") { std::cout << train.front(); // pop_front()는 값을 돌려주지 않는다 train.pop_front(); } else { std::cout << train.back(); // 뗀 차례: 맨 뒤 차량부터 train.pop_back(); } } std::cout << '\n'; } else if (op == "rot") { if (!train.empty()) { long long r = k % (long long)train.size(); // 한 바퀴 돌면 제자리다 // [begin, begin + r)이 끝으로 간다: 앞의 r개가 뒤로 std::rotate(train.begin(), train.begin() + r, train.end()); } } } std::cout << train.size() << '\n'; if (train.empty()) std::cout << "-\n"; for (std::size_t i = 0; i < train.size(); i++) std::cout << train[i] << (i + 1 < train.size() ? ' ' : '\n');}