문제
https://www.acmicpc.net/problem/5430
5430번: AC
각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.
www.acmicpc.net
알고리즘 분류에 덱이 있길래 LinkedList를 사용 할 생각이었는데(C#엔 덱이 없음) 아무리 구상해도 안되길래.. 일단 배열의 Reverse()기능을 사용해봤다.(실패)
코드
using System;
using System.Text;
using System.Collections.Generic;
namespace baekjoon
{
class Algorithm
{
static void Main(string[] str)
{
// 테스트 케이스 개수
int testCaseCnt = Convert.ToInt32(Console.ReadLine());
StringBuilder sb = new StringBuilder();
// 테스트 케이스 개수만큼 반복
while(testCaseCnt-- > 0)
{
string doMethod = Console.ReadLine(); // RDD
int arrLength = Convert.ToInt32(Console.ReadLine()); // 배열 길이
string s = Console.ReadLine();
s = s.Substring(1, s.Length - 2);
string[] arr = s.Split(','); // 배열
bool reverse = false;
bool isError = false;
int minusCnt = 0;
int start = 0;
int end = arr.Length - 1;
for(int i = 0; i < doMethod.Length; i++)
{
// reverse 여부 설정
if(doMethod[i] == 'R')
{
reverse = !reverse;
}
else
{
// 삭제 인자 개수
minusCnt++;
// 만약 삭제 인자 개수가 arr.Length를 넘어가면
// 바로 error 출력
if(minusCnt > arrLength)
{
isError = true;
break;
}
// 만약 reverse 한다면
// 뒤에서 삭제
if(reverse == true)
{
end--;
}
else
{
start++;
}
}
}
if(isError == false)
{
sb.Append('[');
if(reverse == true)
{
for(int i = end; i >= start; i--)
{
if(i == start)
{
sb.Append($"{arr[i]}");
}
else
{
sb.Append($"{arr[i]},");
}
}
}
else
{
for(int i = start; i <= end; i++)
{
if(i == end)
{
sb.Append($"{arr[i]}");
}
else
{
sb.Append($"{arr[i]},");
}
}
}
sb.Append(']');
sb.AppendLine();
}
else
{
sb.AppendLine("error");
}
}
Console.Write(sb);
}
}
}
고민
처음엔 배열의 Reverse()를 사용하다가 RunTimeException이 발생했다. 그래서 R이 들어오면 바로바로 배열을 뒤집고 D가 들어오면 뒤집어진 배열에서 삭제하고..를 반복했더니 또.. RunTimeException...
다른 분들 코드를 보니까 알겠던게 '최종 값만 바꾸면 됨'이었다.
bool값이나 int 등 변수들에 최종 상태를 저장해주고 마지막 출력하기 직전 변수드를 참고해서 상태를 변화시켜주면 되는 것이었다.
위 코드에서는 reverse가 true면? reverse해주고 아니면 해주지 않았다.
isError가 true면 바로 error를 출력했다.
마지막으로 삭제는.. reverse라면 start값을 올렸고 !reverse라면 end값을 내렸다. 값을 올려주고 내려주는 이유는 출력할 때 index값으로 start와 end를 사용하기 위함이다. 실제 배열에서 값을 삭제한 것이 아니라 지정된 범위만 출력해주면? 답을 구하는데 지장없다.
우리가 코드에서 필요한건 올바른 결과값이 나오는 것이지 실제로 배열이 몇 번 뒤집혔고 값이 잘 삭제되었고의 문제가 아니었다.
배열의 index를 활용하여 복잡도를 줄이고 bool값을 활용하여 결과시점에서 결과만 반영한다는 것이 정말 똑똑하다고 생각했다. 온전히 내 힘으로 푼 문제가 아니라 부끄럽지만 그럼에도 기억하기 위해서 적고 올려본다.
'동식이 취업시키기 작전 > 코딩테스트' 카테고리의 다른 글
[백준] 1764 듣보잡(C#) (0) | 2024.01.24 |
---|---|
[백준] 11866 요세푸스(C#) (1) | 2024.01.23 |
[백준] 1158 요세푸스(C#) (0) | 2024.01.22 |
[백준] 10816 숫자카드2(c#) (0) | 2024.01.22 |
[백준] 1874 스택 수열(c#) (0) | 2024.01.22 |