본문 바로가기

코딩테스트 연습/JAVA

[JAVA/알고리즘] 다트게임

반응형

 

 

 

- 내 풀이

문자열을 char 배열로 만든 후에 처리했다. 처음에 10이 있는 걸 간과하고 하나씩 봤는데 10 때문에 하나씩 보는게 어려웠다. 10인 경우만 따로 빼기엔 복잡해질 것 같아서 문자가 나올 때까지는 숫자에 더하게 했다(score 변수). 중간중간 자꾸 범위 초과 에러가 떴는데 나조차도 헷갈려서 향상된 for문을 사용했더니 오류가 사라졌다. 왜 그랬는지는 아직도 의문..

import java.util.*;

class Solution {
    public int solution(String dartResult) {
        char[] dart = dartResult.toCharArray();
        int[] scoreArr = new int[3];
        int round = 0;
        String score = "";

        for (char ch : dart) {
            if (ch == 'S' || ch== 'D' || ch == 'T') {
                int area = (ch == 'S' ? 1 : (ch == 'D'? 2 : 3));
                scoreArr[round] = (int) Math.pow(Integer.parseInt(score), area);
                score = "";
                round++;
            } else if (ch == '*') {
                if (round-1 > 0) {
                    scoreArr[round-2] *= 2;
                }
                scoreArr[round-1] *= 2;
            } else if (ch == '#') {
                scoreArr[round-1] *= -1;
            } else {
                score += ch;
            }
        }
        
        return scoreArr[0] + scoreArr[1] + scoreArr[2];
    }
}

 

- 간과했던 점

char 형을 int 형으로 바꿀 때에는 아스키코드를 고려해야 한다. '0'을 빼면 원래 생각했던 숫자 그대로가 나온다.

 

- 첫 시도

import java.util.*;

class Solution {
    public int solution(String dartResult) {
        int finalScore = 0;
        int[] scoreArr = new int[3];
        char[] dart = dartResult.toCharArray();
        int s = 0;
        
        for (int i = 0; s < 3; ++s, i=i+2) {
            int area = (dart[i+1] == 'S' ? 1 : (dart[i+1] == 'D'? 2 : 3));
            int score = dart[i] - '0';
            scoreArr[s] = (int) Math.pow(score, area);
            
            System.out.println(score + " " + area + " " + scoreArr[s]);
            
            if (i == dart.length - 2) {
                break;
            }
            
            if (dart[i+2] == '*') {
                if (s > 0) {
                    scoreArr[s-1] *= 2;
                }
                scoreArr[s] *= 2;
                i++;
            } else if (dart[i+2] == '#') {
                scoreArr[s] *= -1;
                i++;
            }
        }
        
        finalScore = scoreArr[0] + scoreArr[1] + scoreArr[2];
        return finalScore;
    }
}

 

- 다른 풀이

스택을 썼다. 아직 스택을 쓰는 게 익숙하지 못한 것 같다. 다만 내 코드보다는 10줄 가량이 긴데, 어떤 코드가 더 좋은 코드인지는 잘 모르겠다.

import java.util.*;
class Solution {
    public int solution(String dartResult) {
        Stack<Integer> stack = new Stack<>();
        int sum = 0;
        for (int i = 0; i < dartResult.length(); ++i) {
            char c = dartResult.charAt(i);
            if (Character.isDigit(c)) {
                sum = (c - '0');
                if (sum == 1 && i < dartResult.length() - 1 && dartResult.charAt(i + 1) == '0') {
                    sum = 10;
                    i++;
                }
                stack.push(sum);
            } else {
                int prev = stack.pop();
                if (c == 'D') {
                    prev *= prev;
                } else if (c == 'T') {
                    prev = prev * prev * prev;
                } else if (c == '*') {
                    if (!stack.isEmpty()) {
                        int val = stack.pop() * 2;
                        stack.push(val);
                    }
                    prev *= 2;
                } else if (c == '#') {
                    prev *= (-1);
                }
                // System.out.println(prev);
                stack.push(prev);
            }
        }
        int totalScore = 0;
        while (!stack.isEmpty()) {
            totalScore += stack.pop();
        }
        return totalScore;
    }
}

 

- 해설

카카오 공채 문제이고 지금도 그런지는 모르겠지만 카카오에서 해설을 공개했다. 카카오에서 밝히기로는 난이도가 하 라고..ㅎㅎ 더 열심히 해야겠다.

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

 

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

‘블라인드’ 전형으로 실시되어 시작부터 엄청난 화제를 몰고 온 카카오 개발 신입 공채. 그 첫 번째 관문인 1차 코딩 테스트가 지난 9월 16일(토) 오후 2시부터 7시까지 장장 5시간 동안 온라인

tech.kakao.com

 

반응형