ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 카카오 1차 온라인 코딩테스트 2번 문제(17.09.16)
    💻 프로그래밍/알고리즘 2017. 10. 5. 00:34

    안녕하세요~! 코딩하는 '잡'개발자 JAY 입니다!! :D


    오늘은 카카오1차 온라인 코딩테스트 2번 문제를 풀이해보도록 하겠습니다.


    문제 및 풀이 링크 : http://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/


    2. 다트 게임(난이도: 하)

    2번 문제는 다트게임 입니다. 문제풀다가 갑자기 아이유가 나와서 당황했네요 ㅋㅋㅋ(깨알 카카오 게임 홍보)

    문제를 간단히 요약하자면 3번 다트를 던졌을때 나오는 점수의 합을 구하는 것입니다.

    다트점수는 1~10,  Single(S), Double(D), Triple(T)(점수^1 , 점수^2 , 점수^3 ), 스타상/아차상(해당 점수 및 바로전 점수 두배/ 해당 점수 -화) 이렇게 구성되어 있는 채점방식을 통해 점수가 구해집니다.

    그래서 입력형식은 "1S2D*3T" 이렇게 string으로 입력되어 집니다.


    카카오 해설:  문자열 처리String Manipulation를 묻는 문제입니다. 앞에서부터 한 글자씩 잘라서 처리할 수 있고, 또는 간단한 컴파일러를 만들듯이 토큰화Tokenizing와 의미 분석Semantic Analysis을 통해 어렵지 않게 계산할 수 있습니다.


    네.. 이렇다고 합니다. 근데 정말 어렵지 않게 문제를 풀 수 있으며, 문자열을 하나씩 체크하여 계산 방식만 맞게 처리해주면 문제는 그리 어렵지 않게 풀립니다. 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #include <iostream>
    #include <string>
    #include <math.h>
     
    using namespace std;
    int solution(string dartResult);
    int main(void)
    {
        cout << "answer : " << solution("1S2D*3T"<< endl;
        cout << "answer : " << solution("1D2S#10S"<< endl;
        cout << "answer : " << solution("1D2S0T"<< endl;
        cout << "answer : " << solution("1S*2T*3S"<< endl;
        cout << "answer : " << solution("1D#2S*3S"<< endl;
        cout << "answer : " << solution("1T2D3D#"<< endl;
        cout << "answer : " << solution("1D2S3T*"<< endl;
     
        return 0;
    }
     
    int solution(string dartResult) 
    {
        int answer = 0;
        unsigned int strLength = 0;    // 문자열 길이
        int unitDigit = 0;                   // 1일때 한번더 숫자를 체크하면 10의자리
        int dartPoint[3= {000};     // 다트점수
        int pointPosition = -1;          // 다트 순서
     
        strLength = dartResult.length();        
        // 문자열 길이만큼 for문을 돌려 점수 합산
        int tempPoint = 0
        for(int j = 0; j < strLength; j ++) {
            if(dartResult[j] >= '0' && dartResult[j] <= '9') { // 숫자(점수) 체크
                if(unitDigit == 1) { // 10일 경우
                    tempPoint *= 10;
                } else {
                    tempPoint = 0;
                    tempPoint = dartResult[j] - '0'// aToi
                    pointPosition += 1;
                    unitDigit = 1
                }
            } else if(dartResult[j] == 'S' || dartResult[j] == 'D' || dartResult[j] == 'T') { // 보너스 체크
                if(dartResult[j] == 'S') tempPoint = (int)pow(tempPoint, 1);
                else if(dartResult[j] == 'D') tempPoint = (int)pow(tempPoint, 2);
                else if(dartResult[j] == 'T') tempPoint = (int)pow(tempPoint, 3);
                dartPoint[pointPosition] = tempPoint;
                unitDigit = 0;
            } else {
                if(dartResult[j] == '*') { // 스타상 : 해당점수와 바로 전 점수 두배
                    if(pointPosition > 0) dartPoint[pointPosition - 1*= 2;
                    dartPoint[pointPosition] = tempPoint * 2;
                } else if(dartResult[j] == '#') { // 해당점수 -화
                    dartPoint[pointPosition] = tempPoint * -1;
                }                
            }
        }
        
        answer = dartPoint[0+ dartPoint[1+ dartPoint[2];
     
        return answer;    
    }

    소스코드를 보시면 문자열의 길이만큼 for문을 돌려 입력된 문자열의 원소를 하나하나 체크하여 계산하는 것을 볼 수 있습니다. S, D, T 계산의 경우 math.h의 pow함수를 사용하여 계산하였습니다.

    그리고 문자열에서 -'0' 하여 계산해준 이유는 예를들어 '1'의 경우 아스키코드 값이므로 int형으로 보면 49입니다. '0'은 48이겠죠? 그렇기 때문에 '1'(49) - '0'(48) 해주면 int형으로 1이라는 숫자를 얻게 됩니다. 즉 Ascii to Int라고 보시면 됩니다. 쉬운 내용이지만 모르시는 분들도 있을 것 같아서 말씀드려요~


    아스키 코드 관련 설명 : https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C


    문제 2번의 경우 문자열과 문자열을 처리하는 방법만 알고 있으면 간단히 풀 수 있는 문제였습니다.

    이상으로 카카오 1차 온라인 코딩테스트 2번문제 풀이였습니다.

    즐거운 코딩하세요~! JAY 였습니다!!

    댓글

운동하는 개발자 JAY-JI