카카오 신입공채 1차 코딩테스트 문제2 다트게임 JAVA 예제

카카오톡 신입공채 1차 코딩 테스트 문제2 다트게임 JAVA 예제카카오톡 신입공채 1차 코딩 테스트 문제2 다트게임 JAVA 예제


카카오 신입공채 1차 코딩테스트 문제2 다트게임 JAVA 예제


문제설명

카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.

갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.


  1. 다트 게임은 총 3번의 기회로 구성된다.
  2. 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.
  3. 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수^1 , 점수^2 , 점수^3 )으로 계산된다.
  4. 옵션으로 스타상(*) , 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.
  5. 스타상(*)은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상(*)의 점수만 2배가 된다. (예제 4번 참고)
  6. 스타상(*)의 효과는 다른 스타상(*)의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다. (예제 4번 참고)
  7. 스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고)
  8. Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.
  9. 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.
0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.

입력 형식

“점수|보너스|[옵션]”으로 이루어진 문자열 3세트.
예) 1S2D*3T
  • 점수는 0에서 10 사이의 정수이다.
  • 보너스는 S, D, T 중 하나이다.
  • 옵선은 *이나 # 중 하나이며, 없을 수도 있다.

출력 형식

3번의 기회에서 얻은 점수 합계에 해당하는 정수값을 출력한다.
예) 37


입출력 예제


문제 해설

문자열 처리String Manipulation를 묻는 문제입니다. 앞에서부터 한 글자씩 잘라서 처리할 수 있고, 또는 간단한 컴파일러를 만들듯이 토큰화Tokenizing와 의미 분석Semantic Analysis을 통해 어렵지 않게 계산할 수 있습니다.
점수 중에는 한 자리뿐만 아니라 두 자리인 10점도 포함되어 있기 때문에 한 글자씩 잘라서 처리할때는 그 부분에 유의해야겠네요. 토큰화로 처리할 때는 정규식을 사용하면 비교적 쉽게 잘라낼 수 있습니다. S, D, T는 각각 원점수, 제곱, 세제곱으로 처리하고 스타상은 두 배로 계산하면 됩니다. 참, 아차상은 마이너스 점수라는 점에 유의하세요.
이 문제의 정답률은 73.47%입니다. 앞서 비밀지도 보다는 낮지만 그래도 많은 분들이 잘 풀어주셨습니다.


JAVA 예제


카카오 문제해설에서 제시하는 방법 중 저는 첫번째 방법인 앞글자부터 한 글자씩 잘라서 처리하는 방법으로 예제를 작성해 보았습니다. 까다로운 점은 점수가 1자리 일 수도 있고, 2자리 일수도 있기 때문에 하나씩 확인하면서 숫자인 경우 임시String에 append 해주고, 문자를 만나는 경우 임시String을 int로 변환 하여 숫자를 배열어 넣어서 처리하였습니다.


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
public class Dart {
 
    public static void main(String[] args) {
        System.out.println(getPoint("1S2D*3T")); // 37
        System.out.println(getPoint("1D2S#10S")); // 9
        System.out.println(getPoint("1D2S0T")); // 3
        System.out.println(getPoint("1S*2T*3S")); // 23
        System.out.println(getPoint("1D#2S*3S")); // 5
        System.out.println(getPoint("1T2D3D#")); // -4
        System.out.println(getPoint("1D2S3T*")); // 59
    }
    
    /**
     * S 1승, D 2승, T 3승
     * *해당점수와 바로전의 점수를 2배, #해당점수 -처리 
     * @param pointStr
     * @return
     */
    public static int getPoint(String pointStr) {
        int[] arr = new int[3];
        int curIdx = 0;
        String tempNum = "";
        for(char c : pointStr.toCharArray()) {
            if(Character.isDigit(c)) {
                tempNum = tempNum + c; 
            }
            else {
                if(!"".equals(tempNum)) {
                    arr[curIdx++= Integer.parseInt(tempNum);
                    tempNum = "";
                }
                switch (c) {
                    case 'S' :
                        arr[curIdx-1= (int) Math.pow(arr[curIdx-1], 1);
                        break;
                    case 'D' :
                        arr[curIdx-1= (int) Math.pow(arr[curIdx-1], 2);
                        break;
                    case 'T' :
                        arr[curIdx-1= (int) Math.pow(arr[curIdx-1], 3);
                        break;
                    case '*' :
                        arr[curIdx-1= arr[curIdx-1]*2;
                        if(curIdx-2 >= 0) {
                            arr[curIdx-2= arr[curIdx-2]*2;
                        }
                        break;
                    case '#' :
                        arr[curIdx-1= arr[curIdx-1]*-1;
                        break;
                }
            }
        }
        return arr[0]+arr[1]+arr[2];
    }
}
cs


문의 및 댓글 환영 :)




이 글을 공유하기

댓글

Email by JB FACTORY