반응형
[ 문제 ]
정수를 저장하는 덱을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 여덟 가지이다.
- 1 X: 정수 X를 덱의 앞에 넣는다. (1 ≤ X ≤ 100,000)
- 2 X: 정수 X를 덱의 뒤에 넣는다. (1 ≤ X ≤ 100,000)
- 3: 덱에 정수가 있다면 맨 앞의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
- 4: 덱에 정수가 있다면 맨 뒤의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
- 5: 덱에 들어있는 정수의 개수를 출력한다.
- 6: 덱이 비어있으면 1, 아니면 0을 출력한다.
- 7: 덱에 정수가 있다면 맨 앞의 정수를 출력한다. 없다면 -1을 대신 출력한다.
- 8: 덱에 정수가 있다면 맨 뒤의 정수를 출력한다. 없다면 -1을 대신 출력한다.
[ 코드 ]
1. 내 코드
using System.Text;
StreamReader sr = new StreamReader(new BufferedStream(Console.OpenStandardInput()));
StreamWriter sw = new StreamWriter(new BufferedStream(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[] s = sr.ReadLine().Split();
int a = int.Parse(s[0]);
int b = 0;
if(s.Length >= 2)
{
b = int.Parse(s[1]);
}
switch (a)
{
case 1:
list.AddFirst(b);
break;
case 2:
list.AddLast(b);
break;
case 3:
sb.AppendLine($"{(list.Count > 0 ? list.First.Value : -1)}");
if(list.Count != 0)
{
list.RemoveFirst();
}
break;
case 4:
sb.AppendLine($"{(list.Count > 0 ? list.Last.Value : -1)}");
if (list.Count != 0)
{
list.RemoveLast();
}
break;
case 5:
sb.AppendLine($"{list.Count}");
break;
case 6:
sb.AppendLine($"{(list.Count > 0 ? 0 : 1)}");
break;
case 7:
sb.AppendLine($"{(list.Count > 0 ? list.First.Value : -1)}");
break;
case 8:
sb.AppendLine($"{(list.Count > 0 ? list.Last.Value : -1)}");
break;
}
}
sw.Write(sb.ToString());
sw.Flush();
sw.Close();
sr.Close();
2. 다른 사람 코드
- 덱 함수를 직접 구현
namespace Baekjoon;
using System;
using System.Text;
public class Program
{
private static readonly StreamReader _sr = new(new BufferedStream(Console.OpenStandardInput()));
private static readonly StreamWriter _sw = new(new BufferedStream(Console.OpenStandardOutput()));
private static readonly StringBuilder _ret = new StringBuilder();
private static void Main(string[] args)
{
var cmdCount = ScanInt();
Deque deque = new();
for (int i = 0; i < cmdCount; i++)
{
var cmdType = ScanInt();
int arg;
switch (cmdType)
{
case 1:
arg = ScanInt();
deque.PushFront(arg);
break;
case 2:
arg = ScanInt();
deque.PushBack(arg);
break;
case 3:
Append(deque.PopFront());
break;
case 4:
Append(deque.PopBack());
break;
case 5:
Append(deque.Count);
break;
case 6:
Append(deque.Count == 0 ? 1 : 0);
break;
case 7:
Append(deque.PeekFront());
break;
case 8:
Append(deque.PeekBack());
break;
}
}
_sw.Write(_ret);
_sr.Close();
_sw.Close();
}
private static void Append(int v)
{
_ret.Append(v).Append('\n');
}
static int ScanInt()
{
int c, n = 0;
while (!((c = _sr.Read()) is ' ' or '\n' or -1))
{
if (c == '\r')
{
_sr.Read();
break;
}
n = 10 * n + c - '0';
}
return n;
}
}
internal class Deque
{
readonly int[] _array = new int[1_000_000];
int _headIndex = 0, _tailIndex = 1;
public int Count
{
get
{
var diff = _tailIndex - _headIndex - 1;
if (diff < 0) diff += _array.Length;
return diff;
}
}
internal int PeekBack()
{
var ret = -1;
if (Count > 0)
{
ret = _array[Sub1ByCycle(_tailIndex)];
}
return ret;
}
internal int PeekFront()
{
var ret = -1;
if (Count > 0)
{
ret = _array[Add1ByCycle(_headIndex)];
}
return ret;
}
internal int PopBack()
{
var ret = -1;
if (Count > 0)
{
ret = _array[_tailIndex = Sub1ByCycle(_tailIndex)];
}
return ret;
}
internal int PopFront()
{
var ret = -1;
if (Count > 0)
{
ret = _array[_headIndex = Add1ByCycle(_headIndex)];
}
return ret;
}
internal void PushBack(int arg)
{
_array[_tailIndex] = arg;
_tailIndex = Add1ByCycle(_tailIndex);
}
internal void PushFront(int arg)
{
_array[_headIndex] = arg;
_headIndex = Sub1ByCycle(_headIndex);
}
int Add1ByCycle(int value)
{
if (++value >= _array.Length)
value -= _array.Length;
return value;
}
int Sub1ByCycle(int value)
{
if (--value < 0)
value += _array.Length;
return value;
}
}
[ 실행화면 ]
문제링크: https://www.acmicpc.net/problem/28279
반응형
'Language > C#' 카테고리의 다른 글
[C#] 백준 24511번 queuestack (0) | 2024.03.29 |
---|---|
[C#] 백준 2346번 풍선 터뜨리기 (0) | 2024.03.28 |
[C#] 백준 18258번 큐 2 (0) | 2024.03.26 |
[C#] 백준 12789번 도키도키 간식드리미 (0) | 2024.03.26 |
[C#] 백준 4949번 균형잡힌 세상 (1) | 2024.03.25 |