문제풀이/프로그래머스

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

Hyeon-Uk 2021. 6. 4. 18:29
반응형

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

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr


 

-풀이-

먼저 dartResult를 순회하면서

1. 숫자면 숫자 배열에 넣는다.

ex) 문자열이 123이라면, 먼저 temp에 1을 넣는다. 그다음 2를 받을때 temp=temp*10 + 2를 해주면, 12가 된다. 다음 3을 받을때 temp = temp * 10 + 3을 한다면 123 이 된다. 이렇게 한 문자 문자 검사를 하며 숫자들을 이어 붙일 수 있다.

 

2. 숫자가 아닌 문자를 만나면, 계산을 시작한다.

 

2-1) 현재 검사하고 있는 문자가 'S', 'D', 'T' 일경우, 각 경우에 맞는 temp를 업데이트 해준다.

EX) 'D'이면, temp=temp*temp;

 

2-2) 갱신을 한 temp값을 해당 결과값을 저장하는 배열에 넣어준다 (answer가 아닌 임시 result 배열을 말한다.)

 

2-3) 현재 검사하고있는 문자의 다음 문자가 '*' 이나 '#'이면 다음 실행을 한다.

  • 2-3-1) 만약 다음 문자가 '*' 이라면, 현재 넣어준 임시 result값에 2배를 한다. 만약 현재 넣어준 값의 인덱스가   아니라면, 이전 넣어줬던 result값에다가도 2배를 해준다.
  • 2-3-2) 만약 다음문자가 '#' 이라면, 현재 넣어준 임시 result값에 -1을 곱해준다.
  • 2-3-3) 처리를 해준 뒤에, 해당 문자열의 인덱스를 검사했다는 처리를 해준다. (이 코드에선 i++;)

2-4) 숫자를 임시저장하는 temp값을 0으로 초기화 하고, 다음 계산의 값을 넣어줘야되는 result index를 +1 해준뒤, 반복하여 실행한다.

 

3. 마지막으로 result값을 모두 더해주어 answer로 반환한다.

 

-시간복잡도-

dartResult의 길이를 N이라고 한다면, O(N)이 된다.

 

-코드-

 

#include <string>

using namespace std;

int solution(string dartResult) {
    int answer = 0;
    int result[3]={0};
    int ind=0;
    int temp=0;
    for(int i=0;i<dartResult.size();i++){
        char ch=dartResult[i];
        if(ch>='0'&&ch<='9'){
            temp=temp*10+(ch-'0');
        }
        else{
            if(ch=='D'){
                temp=temp*temp;
            }
            else if(ch=='T'){
                temp=temp*temp*temp;
            }
            
            result[ind]=temp;
            
            if(dartResult[i+1]=='*'){
                result[ind]*=2;
                if(ind!=0){
                    result[ind-1]*=2;
                }
                i++;
            }
            else if(dartResult[i+1]=='#'){
                result[ind]*=-1;
                i++;
            }
            
            ind++;
            temp=0;
        }
    }
    for(int i=0;i<3;i++) answer+=result[i];
    return answer;
}

 

 

반응형