반응형
SMALL
문제

풀이
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace Programmers
{
class Program
{
static void Main()
{
string[] testcase = //테스트 점수 목록
{
"1S2D*3T",
"1D2S#10S",
"1D2S0T",
"1S*2T*3S",
"1D#2S*3S",
"1T2D3D#",
"1D2S3T*"
};
var sol = new Solution(); // 클래스 생성
//Console.WriteLine(testcase.Length);
for (int i = 0; i < testcase.Length; i++) //testcase를 돌며 다트 점수 결과값을 구한다.
{
var dartResult = testcase[i]; //testcase의 인덱스를 dartResult 문자열로 초기화
var result = sol.solution(dartResult); //Solution.solution 메서드를 이용해 인자로 dartResult를 넣어준다.
Console.WriteLine(result); //다트 점수 결과를 표시
}
}
}
class Solution
{
public int solution(string dartResult) //testcase 문자열 배열의 인덱스 요소를 매개변수로
{
Console.WriteLine(dartResult);
int answer = 0; //결과 값 초기화
var str = new string(dartResult.Reverse().ToArray()); // 매개변수를 역순으로 뒤집어 char 형식으로 변경후 문자열에 넣어주기
//Console.WriteLine(str);
Stack<char> stack = new Stack<char>(); // char 형식의 스택 생성
for (int i = 0; i < str.Length; i++) // char 형식의 스택에 str 문자열 요소들을 Push
stack.Push(str[i]);
string num = ""; // 문자열 num 초기화
List<int> result = new List<int>(); // result 리스트 생성
int idx = 0; //인덱스 초기화
while (stack.Count > 0) //스택의 요소의 갯수가 0이 아니게 될때 까지 실행.
{
var c = stack.Peek(); //스택의 마지막 요소 = testcase의 인덱스의 첫번째 문자를 peek 하여 char 변수에 담아 초기화
//숫자 판별
if (c >= '0' && c <= '9') //char 가 0과 같거나 크고 and 9보다 작거나 같을시
{
num += c; //숫자가 한개 이상일 경우 결합
}
else if (c == 'S') //c가 싱글일 경우 1승이니 추가적인 처리가 필요하지 않다.
{
result.Add(int.Parse(num)); //이전에 값을 할당한 char 변수를 정수로 변환하여 result 리스트에 넣어주고
num = ""; //num값 초기화
idx++; //리스트의 다음 인덱스
}
else if (c == 'D') //c가 더블일 경우 2승
{
int n = int.Parse(num); //정수 n 이라는 변수를 num값으로 초기화
result.Add(n * n); // 2승해주기
num = ""; //num값 초기화
idx++;
}
else if (c == 'T') //c가 더트리플일 경우 3승
{
int n = int.Parse(num);
result.Add(n * n * n);
num = "";
idx++;
}
else if (c == '*') //혹시 * 이 있다면
{
//3번의 기회에서 얻은 점수 합계에 해당하는 정수값을 출력한다.
if (idx == 1) //처음 등장시
result[idx - 1] *= 2; //마지막 결과 값을 2배
else
{
//처음이 아니라면 2번째 3번째 임
var last = result.Count - 1;
//Console.WriteLine(idx);
result[last - 1] *= 2;
result[last] *= 2;
}
}
else if (c == '#') //혹시 #이라면
{
result[idx - 1] *= -1; //음수로 만들기
}
stack.Pop(); //peek가 끝나 계산이 완료됐다면 스택에서 제거
}
foreach (var x in result) //result 리스트에 넣어준 각 1차2차3차 각각의 점수를 합산
answer += x;
return answer; //최종 점수 출력
}
}
}
출력

감은 잡았고 코드 작성도 해보았으나 if문에서 결과값을 처리하는 부분이 매끄럽지 못하여 선생님의 작성되어있는 정답지를 보고 분석하였다.
이렇게 보면 정말 별거 아닌듯한데 막상 혼자 작성해보려니 스타상 과 아차상 일때 이전값을 곱하고 음수 처리 해주는 부분이 어려웠다.(result 리스트에 직접 접근하여 idx로 쿼리 하는 부분을 좀 유심히 보았다.)
반응형
LIST
'Algorithm > BOJ' 카테고리의 다른 글
| [BOJ] 9012 괄호 (0) | 2023.01.24 |
|---|---|
| [프로그래머스] 전화번호 목록 C# 풀이 (0) | 2023.01.24 |
| [BOJ] 10822 더하기 C# 사용 풀이 (0) | 2023.01.23 |
| [BOJ] 1254 팰린드롬 만들기 c# 사용 풀이 (1) | 2023.01.23 |
| [BOJ] 1159 농구경기 c# 사용 문제풀이 (2) | 2023.01.22 |