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

    2021. 6. 4.

    by. Hyeon-Uk

    반응형

    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;
    }

     

     

    반응형

    댓글