-
[프로그래머스] 다트게임 자바 리스트수정 합계코딩테스트 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();반응형'코딩테스트' 카테고리의 다른 글
[프로그래머스] 최대공약수와 최소공배수 자바 유클리드 호제법 (1) 2025.04.07 [프로그래머스] 비밀지도 이진법 (0) 2025.04.06 [프로그래머스] 완주하지 못한 선수 자바 해시 맵 활용 (0) 2025.04.06 [프로그래머스] k번째 수 자바 정렬 (0) 2025.04.06 [프로그래머스] 모의고사 자바 완전순회 (0) 2025.04.06