ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 - Lv1. 다트 게임
    PS 2022. 3. 4. 23:58

    문제 : [2018 KAKAO BLIND RECRUITMENT 1차] 다트 게임

    • 문제 내용은 여기.
    • 쉽게 말해, (맞춘 점수)^(맞춘 영역의 제곱)*(보너스/이전보너스/패널티 여부)의 총합을 구하면 된다.

    풀이

    import java.util.stream.Stream;
    
    public class DartGame {
        public int solution(String str) {
            // sdt - S : single (^1) / D : double (^2) / T : Triple (^3)
            // bp - * : 보너스(* 2) / # : 패널티(* -1)
            String[] points = str.replaceAll("\\D+", " ").split("\\s+");
            String[] calcs = Stream.of(str.replaceAll("\\d+", " ").split("\\s+")).skip(1).toArray(String[]::new);
            int total = 0;        
    
            // 라운드별 점수/제곱/보너스or패널티 세팅 
            double[][] pointSdtBp = new double[points.length][3];
    
            for (int i = 0; i < points.length; i += 1) {
                double point = Long.valueOf(points[i]);
                double sdt = "S".equals(calcs[i].substring(0,1)) ? 1 : ("D".equals(calcs[i].substring(0,1)) ? 2 : 3);
                double bp = calcs[i].length() == 1 ? 1 : ("*".equals(calcs[i].substring(1)) ? 2 : -1);
    
                pointSdtBp[i][0] = point;
                pointSdtBp[i][1] = sdt;
                pointSdtBp[i][2] = bp;
                if (i > 0 && bp == 2) pointSdtBp[i-1][2] *= bp;
            }
    
            // 계산
            for (double[] psb : pointSdtBp) {
                total += Math.pow(psb[0], psb[1]) * psb[2];
            }
    
            return total;
        }
    }
    • calcs[]를 초기화 할 때만 Stream을 쓴 이유는, 배열 0번째에 무조건 공백문자("")가 들어가게 되는데 이를 제외(skip(1))하기 위해서다. 이를 제외하기 위한 더 좋은 방법이 있을 것 같은데 일단 당장은 모르겠다.

    후기

    1 ) 사실 로직은 별로 특별할 것도 없는데 Stream을 잘 몰라서 1.5시간 정도 헤맸다(내가 익숙한 Java는 Java7이 마지막이었다...). 날 잡고 Stream 공부를 하든지, Java8 공부를 따로 하든지 해야할 것 같다.

    댓글

Designed by Tistory.