ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 다트게임 자바 리스트수정 합계
    코딩테스트 2025. 4. 6. 15:38
    반응형

    https://school.programmers.co.kr/learn/courses/30/lessons/17682

     

    프로그래머스

    SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

    programmers.co.kr

    문제

    문자열 dartResult를 해석한 결과 점수를 구하시오.

    * 게임은 3회 진행
    * 회차별 점수는 0 <= n <= 10
    * 점수 외에 영역 S D T 존이 존재하고 S = n^1 D = n^2 T = n^3 이며 점수마나 하나씩 존재한다.
    * 옵션으로 스타상(*) = 2*(해당 점수와 직전 점수) 아차상(#) = -1* (해당 점수)
    * 스타상은 스타상 효과와 중첩될 수 있다.
    * 스타상은 아차상 효과와 중첩될 수 있다.
    * 스타상과 아차상은 점수마다 둘 중 하나만 들어갈 수 있고 없을 수도 있다.

    접근

    1. 문자열에서 점수부분만 따로 추출하여 List에 넣음
    2. SDT 제곱계산용 메서드 별도 처리
    3. * # S D T 의 경우의 로직처리 구현
    public int solution(String dartResult) {
            int answer = 0;
            List<Integer> points = new ArrayList<>();
            //점수 추출
            for(int i = 0; i < dartResult.length(); i++){
                char c = dartResult.charAt(i);
                //'1' = 49 '9' = 57
                if('0' <= c && c <= '9'){
                    int point = Character.getNumericValue(c);
                    if(c == '1' && dartResult.charAt(i +1) == '0'){
                        i += 1;
                        point = 10;
                    }
                    points.add(point); //점수 저장
                } else if( c == '*'){
                    answer = 2 * answer;
                } else if( c == '#'){
                    answer -= 2 * points.get(points.size() -1);
                } else if( c == 'S' || c == 'D' || c == 'T'){
                    int point = points.get(points.size() -1);
                    point = calSDT(c, point);
                    points.set(points.size() -1, point);
                    answer += point;
                }
            }
    
            return answer;
        }
    
    
        public int calSDT(char c, int point){
            return switch (c) {
                case 'D' -> (int) Math.pow(point, 2);
                case 'T' -> (int) Math.pow(point, 3);
                default -> point;
            };
        }

    발견된 문제

    1. 점수 누적 방식 오류:
    현재 코드는 answer += point로 점수를 누적하면서 동시에 스타상(*) 처리 시 전체 점수를 2배로 곱함이로 인해 중복 계산이 발생
    2.스타상(*) 처리 시점 문제:
    스타상이 현재와 이전 점수에 모두 영향을 주어야 하지만, 현재 구현은 전체 점수만 2배로 곱함
    3.아차상(#) 처리 오류:아차상 적용 시 answer에서 빼는 방식이 잘못됨

    수정

    public static int solution2(String dartResult) {
            List<Integer> points = new ArrayList<>();
    
            for (int i = 0; i < dartResult.length(); i++) {
                char c = dartResult.charAt(i);
    
                if ('0' <= c && c <= '9') {
                    int point = Character.getNumericValue(c);
                    if (c == '1' && i + 1 < dartResult.length() && dartResult.charAt(i + 1) == '0') {
                        point = 10;
                        i++;
                    }
                    points.add(point);
                }
                else if (c == 'S' || c == 'D' || c == 'T') {
                    int lastIdx = points.size() - 1;
                    int point = points.get(lastIdx);
                    point = calSDT(c, point);
                    points.set(lastIdx, point);
                }
                else if (c == '*' || c == '#') {
                    int lastIdx = points.size() - 1;
                    if (c == '*') {
                        points.set(lastIdx, points.get(lastIdx) * 2);
                        if (lastIdx > 0) {
                            points.set(lastIdx - 1, points.get(lastIdx - 1) * 2);
                        }
                    } else {
                        points.set(lastIdx, points.get(lastIdx) * -1);
                    }
                }
            }
    
            return points.stream().mapToInt(Integer::intValue).sum();
        }

    알게된 점

    1. 리스트의 idx 위치 값 수정 : list.set(idx, v)
    2. 리스트 합계 한번에 : list.stream().mapToInt(Integer::intValue).sum();
    반응형

    댓글

Designed by Tistory.