목차
백준 단계별로 풀어보기
25.11.23
16단계: 스택, 큐, 덱 1
28279번: 덱 2
문제 링크 : https://www.acmicpc.net/problem/28279
문제를 풀기 위해 알아야 할 개념
>> Deque (덱)
: 모든 요소에 대한 빠른 임의 액세스와 앞, 뒤쪽 모두 효율적인 삽입 및 삭제가 가능한 자료구조이다.
--> 하지만 C#에서 Deque 자료구조를 지원하지 않는다.
※ 공식 문서 - Deque (C++)
deque 클래스
자세한 정보: deque 클래스
learn.microsoft.com
>> LinkedList
: 이중으로 연결된 List로, 각 요소가 노드(Node)로 구성되며 각 노드는 데이터와 다음 노드에 대한 참조, 이전 노드에 대한 참조를 포함한다.
- 동적 메모리 할당을 통해 크기가 가변적이다.
- 연속적인 메모리 주소에 저장되는 것이 아니라 비연속적으로 저장되며, 이전과 다음 노드 정보를 통해 데이터를 연결한다.
- 배열과 달리 요소의 삽입 및 삭제가 용이하다.
>> 주요 메서드
- AddFirst(x) : 주어진 요소 x를 LinkedList의 시작 부분에 새로운 노드로 추가한다.
- AddLast(x) : 주어진 요소 x를 LinkedList의 끝 부분에 새로운 노드로 추가한다.
- Remove(x) : 주어진 요소 x와 첫 번째로 일치하는 요소를 LinkedList에서 제거한다.
- RemoveFirst() : LinkedList의 첫 번째 노드를 제거한다.
- RemoveLast() : LinkedList의 마지막 노드를 제거한다.
- First : LinkedList의 첫 번째 노드를 가져온다. 노드가 없는 경우 null을 반환한다.
- Last : LinkedList의 마지막 노드를 가져온다. 노드가 없는 경우 null을 반환한다.
- Count : LinkedList에 있는 요소의 개수를 반환한다.
- Clear() : LinkedList에 있는 모든 요소를 제거한다.
※ 공식 문서 - LinkedList
LinkedList<T> 클래스 (System.Collections.Generic)
이중으로 연결된 목록을 나타냅니다.
learn.microsoft.com
문제 풀이
: 원래는 Deque을 활용하여 푸는 문제지만, C#에서 Deque를 지원하지 않기 때문에 LinkedList를 활용하여 구현하자.
- StreamReader로 입력값을 받아 int값으로 변환하여 명령의 수를 담을 변수 n 에 담고, int형 LinkedList list 를 초기화한다.
- for 반복문을 통해 명령을 수행한다.
- StreamReader로 명령을 받아 string형 변수 input 에 담는다.
- switch 문을 통해 input 의 첫번째 값에 따라 명령을 수행한다.
- input 이 1이라면 Substring을 통해 LinkedList에 담을 정수를 변수 num1 에 담고 AddFirst로 시작 부분에 새로운 노드로 추가한다.
- input 이 2라면 Substring을 통해 LinkedList에 담을 정수를 변수 num2 에 담고 AddLast로 끝 부분에 새로운 노드로 추가한다.
- input 이 3이라면 삼항연산자를 통해 LinkedList가 비어있지 않으면 첫 번째 노드를 가져와 StringBuilder에 담고 비어있다면 -1 을 담는다. 이때, StringBuilder에 첫 번째 노드를 담았다면 RemoveFirst() 로 첫 번째 노드를 제거한다.
- input 이 4라면 삼항연산자를 통해 LinkedList가 비어있지 않으면 마지막 노드를 가져와 StringBuilder에 담고 비어있다면 -1 을 담는다. 이때, StringBuilder에 마지막 노드를 담았다면 RemoveLast() 로 마지막 노드를 제거한다.
- input 이 5라면 StringBuilder에 LinkedList의 Count를 담는다.
- input 이 6이라면 삼항연산자를 통해 LinkedList가 비어있지 않으면 0을, 비어있다면 1을 담는다.
- input 이 7이라면 삼항연산자를 통해 LinkedList가 비어있지 않으면 첫 번째 노드를 가져와 StringBuilder에 담고 비어있다면 -1 을 담는다.
- input 이 8이라면 삼항연산자를 통해 LinkedList가 비어있지 않으면 마지막 노드를 가져와 StringBuilder에 담고 비어있다면 -1 을 담는다.
- 반복문이 끝나면 StreamWriter로 StringBuilder에 담은 값을 출력한다.
정답 코드
using System.IO;
using System.Text;
class Backjoon
{
static void Main(string[] args)
{
using var sr = new StreamReader(Console.OpenStandardInput());
using var sw = new StreamWriter(Console.OpenStandardOutput());
StringBuilder sb = new StringBuilder();
int n = int.Parse(sr.ReadLine());
LinkedList<int> list = new LinkedList<int>();
for (int i = 0; i < n; i++)
{
string input = sr.ReadLine();
switch (input[0])
{
case '1':
int num1 = int.Parse(input.Substring(2));
list.AddFirst(num1);
break;
case '2':
int num2 = int.Parse(input.Substring(2));
list.AddLast(num2);
break;
case '3':
sb.AppendLine(list.Count > 0 ? list.First.Value.ToString() : "-1");
if (list.Count > 0)
list.RemoveFirst();
break;
case '4':
sb.AppendLine(list.Count > 0 ? list.Last.Value.ToString() : "-1");
if (list.Count > 0)
list.RemoveLast();
break;
case '5':
sb.AppendLine(list.Count.ToString());
break;
case '6':
sb.AppendLine(list.Count > 0 ? "0" : "1");
break;
case '7':
sb.AppendLine(list.Count > 0 ? list.First.Value.ToString() : "-1");
break;
case '8':
sb.AppendLine(list.Count > 0 ? list.Last.Value.ToString() : "-1");
break;
}
}
sw.Write(sb.ToString());
}
}'Development > Baekjoon' 카테고리의 다른 글
| [C#] 24511번: queuestack (0) | 2025.11.25 |
|---|---|
| [C#] 2346번: 풍선 터뜨리기 (0) | 2025.11.24 |
| [C#] 11866번: 요세푸스 문제 0 (0) | 2025.11.22 |
| [C#] 2164번: 카드2 (0) | 2025.11.21 |
| [C#] 18258번: 큐 2 (0) | 2025.11.19 |