본 문제는 2018년도 카카오 블라인드 구인 코딩테스트 기출문제입니다.
<링크>
https://school.programmers.co.kr/learn/courses/30/lessons/17682
<문제 설명 및 해석>
1. 다트 게임은 총 3회
2. 기회마다 얻는 점수 0~10
3. 영역: S-1제곱, D-2제곱, T-3제곱
4. 옵션: 스타상*- 해당점수와 이전점수 각2배/ 아차상#- 해당점수 마이너스
5. 스타상은 첫번째에도 나올수있음, 이경우 첫번째만 적용,
스타상은 다른스타상과 중첩적용 이경우 4배,
스타상과 아차상 중첩적용 이경우 -2배
6. S,D,T 는 점수마다 하나씩 존재,
스타상과 아차상은 둘중하나만 존재하며 존재하지 않을 수도 있음.
7. answer = 다트게임3회의 총점수
ex) 1S2D*3T : 1게임 1점S/ 2게임 2점D* / 3게임 3점T
<문제 풀이>
문자를 하나씩 검사한 후 숫자인 경우 점수로 계산하고 이후의 문자들을 switch-case문으로 계산해주었다.
class Solution {
public int solution(String dartResult) {
int answer = 0; // 다트게임 총점
// 게임당 점수 배열 선언
int[] scores = new int[3];
String[] dart = dartResult.split("");
int scoreIdx = -1; // 해당 라운드를 추적할 인덱스
for(int i=0; i<dart.length; i++){
// 숫자인지 확인
if(dart[i].matches("[0-9]")){
scoreIdx++;
scores[scoreIdx] = Integer.parseInt(dart[i]);
// 두자리 숫자인지
if(dart[i+1].matches("[0-9]")){
scores[scoreIdx] *= 10;
i++;
}
}
// 보너스SDT와 옵션 확인
switch(dart[i]){
case "D":
scores[scoreIdx] = (int)Math.pow(scores[scoreIdx], 2);
break;
case "T" :
scores[scoreIdx] = (int)Math.pow(scores[scoreIdx], 3);
break;
case "*" :
scores[scoreIdx] *= 2;
if(scoreIdx - 1 >= 0) scores[scoreIdx-1] *= 2;
break;
case "#" :
scores[scoreIdx] *= -1;
}
}
// 3게임의 점수 총합 계산
for(int s : scores) {
answer += s;
}
return answer;
}
}
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv1.숫자짝꿍.java (0) | 2023.12.14 |
---|---|
[프로그래머스]Lv1. 옹알이(2). JAVA (1) | 2023.12.07 |
[프로그래머스, JAVA, Lv1, KAKAO] 실패율 (0) | 2023.12.01 |
[프로그래머스, JAVA, Lv1] 덧칠하기 (1) | 2023.11.29 |
[프로그래머스, JAVA, Lv1] 기사단원의 무기 (약수) (0) | 2023.11.28 |