[프로그래머스] 다트게임

Algorithm 2023. 1. 20. 23:51
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/17682

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <iostream>
#include <stack>
#include <algorithm>
#include <vector>

using namespace std;

int solution(string dartResult) {
    int answer = 0;
    reverse(dartResult.begin(), dartResult.end());
    //cout << str << '\n';
    stack<char> stack;

    for(int i = 0; i<dartResult.length(); i++){
        stack.push(dartResult[i]);
    }

    string num = "";
    vector<int> result;
    int index = 0;
    while(!stack.empty()){
        //cout << stack.top() << '\n';
        //stack.pop();
        char c = stack.top();

        if(c >= '0' && c <= '9'){
            //숫자 
            num += c;
        }
        else if(c == 'S')
        {
            result.push_back(stoi(num));
            num = "";
            index++;
        }else if(c == 'D')
        {
            int n = stoi(num);
            result.push_back(n * n);
            num = "";
            index++;
        }
        else if(c == 'T')
        {
            int n = stoi(num);
            result.push_back(n * n * n);
            num = "";
            index++;
        }else if(c == '*')
        {
            if(index == 1) result[index-1] *= 2;
            else {
                result[index - 1] *=2;
                result[index - 2] *=2;
            }
        }else if(c == '#')
        {
            result[index -1] *= -1;
        }

        stack.pop();
        
    }

    for(int x:result){
        answer += x;
    }
    
    //cout << answer << '\n';
    return answer;
}

int main()
{
    string str = "1D2S#10S";
    
    int result = solution(str);

    cout << result << '\n';

    return 0;
}

 

 

 

 

 

c# 

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++)
            {
                var dartResult = testcase[i];
                var result = sol.solution(dartResult);
                Console.WriteLine(result);
            }
            
        }
    }

    class Solution
    {
        public int solution(string dartResult)
        {
            Console.WriteLine(dartResult);
            
            int answer = 0;

            var str = new string(dartResult.Reverse().ToArray());
            //Console.WriteLine(str);

            Stack<char> stack = new Stack<char>();
            
            for(int i =0 ; i<str.Length; i++)
                stack.Push(str[i]);

            string num = "";
            List<int> result = new List<int>();
            int idx = 0;

            while (stack.Count > 0)
            {
                var c = stack.Peek();
                //숫자 판별 
                if (c >= '0' && c <= '9')
                {
                    num += c;   //숫자가 한개 이상일 경우 결합 
                }else if (c == 'S')
                {
                    result.Add(int.Parse(num));
                    num = "";
                    idx++;  //리스트의 다음 인덱스 
                }else if (c == 'D')
                {
                    int n = int.Parse(num);
                    result.Add(n * n);  
                    num = "";
                    idx++;
                }
                else if (c == 'T')
                {
                    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();
            }

            foreach (var x in result)
                answer += x;

            return answer;
        }
    }

}
반응형

'Algorithm' 카테고리의 다른 글

[BOJ] 2684 동전 게임  (0) 2023.01.21
[프로그래머스] 전화번호 목록  (0) 2023.01.20
[BOJ] 21921 블로그  (0) 2023.01.20
[BOJ] 1940 주몽  (0) 2023.01.20
[BOJ] 1254 팰린드롬 만들기  (0) 2023.01.20
: