본문 바로가기
알고리즘 문제

카카오 코딩테스트 - 다트게임

by 박연호의 개발 블로그 2019. 9. 4.

https://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/

 

카카오 신입 공채 1차 코딩 테스트 문제 해설

‘블라인드’ 전형으로 실시되어 시작부터 엄청난 화제를 몰고 온 카카오 개발 신입 공채. 그 첫 번째 관문인 1차 코딩 테스트가 지난 9월 16일(토) 오후 2시부터 7시까지 장장 5시간 동안 온라인으로 치러졌습니다. 지원자들의 개발 능력을 잘 검증하기 위해 출제 위원들이 한 땀 한 땀 독창적이고 다양한 문제들을 만들어 냈고 문제에 이상은 없는지, 테스트케이스는 정확한지 풀어보고 또 풀어보며 […]

tech.kakao.com

처음에 문제를 몇번 읽은 것 같다. 단순 점수계산인데 이런 경우는 이렇고~저런 경우는 저렇고~좀 정리가 필요했다.

처음에 정규표현식을 사용해서 한 세트씩 추출해내고 싶었지만, 방법을 찾지 못해서 그냥 해결했다. 

 

딱히 어떤 알고리즘을 필요한 문제는 아니고, 글 읽는 것 처럼 코드를 작성하면 되는 것 같다.

 

해결 방법은,

먼저 문자열에서 S,D,T의 index번호를 list에 저장하고 하나씩 꺼내면서 index를 기준으로 왼쪽에는 점수/오른쪽에는 옵션이 위치해 있다.

이후에는 이 정보들 가지고 문제에서 요구한 대로 코드를 작성하면 된다. 그리고, 점수를 검사할 때 charAt을 사용하여 점수값을 찾았는데, 점수 자릿수가 2자리 인 경우는 10과 0이 동일시 되기 때문에 index-1와 index-2자리 까지 검사해 주었다.

 

// https://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/
// 다트게임

import java.util.*;
import java.lang.Math;

class Solution {
    public int solution(String dartResult) {

        int[] score = new int[3];
        int[] indexs = new int[3];
        int index = 0;

        for (int i = 0; i < dartResult.length(); i++) {
            if (dartResult.charAt(i) == 83 || dartResult.charAt(i) == 68 || dartResult.charAt(i) == 84) { // 아스키코드를 사용하여
                                                                                                          // S,D,T의 위치
                                                                                                          // 추출
                indexs[index++] = i;
            }
        }

        for (int i = 0; i < 3; i++) {

            index = indexs[i];
            int num = Integer.parseInt(String.valueOf(dartResult.charAt(index - 1)));

            if (dartResult.charAt(index - 1) == '0' && index - 2 >= 0 && dartResult.charAt(index - 2) == '1') { // 10인 경우 index-1 / index-2까지 검사
                num = 10;
            }

            if (i == 0) {
                if (dartResult.charAt(index) == 'D') {
                    num = (int) Math.pow(num, 2);
                } else if (dartResult.charAt(index) == 'T') {
                    num = (int) Math.pow(num, 3);
                }

                if (dartResult.charAt(index + 1) == '*') {
                    num *= 2;
                } else if (dartResult.charAt(index + 1) == '#') {
                    num *= -1;
                }

            } else {
                if (dartResult.charAt(index) == 'D') {
                    num = (int) Math.pow(num, 2);
                } else if (dartResult.charAt(index) == 'T') {
                    num = (int) Math.pow(num, 3);
                }

                if (index + 1 < dartResult.length()) {
                    if (dartResult.charAt(index + 1) == '*') {
                        if (dartResult.charAt(indexs[i - 1]) == '*') {
                            score[i - 1] *= 2;
                        } else if (dartResult.charAt(indexs[i - 1]) == '#') {
                            score[i - 1] *= 2;
                        }
                        score[i - 1] *= 2;
                        num *= 2;

                    } else if (dartResult.charAt(index + 1) == '#') {
                        num *= -1;
                    }
                }

            }
            score[i] = num;
        }
        int result = 0;
        for (int n : score) {
            result += n;
        }
        return result;
    }
}