https://programmers.co.kr/learn/courses/30/lessons/17682
코딩테스트 연습 - [1차] 다트 게임
programmers.co.kr
ㄴ 문제가 길어 링크로 대체
문제 풀이 (JAVA)
class Solution {
public int solution(String dartResult) {
int answer = 0;
int [] score = new int[3]; // 스코어를 기록할 배열 선언
int [] num = new int [3]; // 숫자를 가져올 배열 선언
int j=0;
int k=0;
for(int i=0; i<dartResult.length(); i++){
char ch = dartResult.charAt(i); // i번째 문자를 가져온다.
if(Character.isDigit(ch)){ // 문자가 0~9사이 숫자라면 true
if(ch=='1' && dartResult.charAt(i+1)=='0'){ // 10인 숫자를 구하는 논리식
num[j++]=10;
i++;
}else{ // 10이 아니라면 숫자로 변환하여 숫자배열에 저장.
num[j++] = Character.getNumericValue(ch);
}
}else{ // 문자가 숫자가 아니라면 (S,D,T ,*,#)
switch (ch){
case 'S' :
score[k++]=(int)Math.pow(num[j-1],1); // num[j-1]은 위에서 숫자를 저장후 j를 증가시키기 때문.
break;
case 'D' :
score[k++]=(int)Math.pow(num[j-1],2);
break;
case 'T' :
score[k++]=(int)Math.pow(num[j-1],3);
break;
case '*' :
if(j==1){ // 첫번째 기록 숫자일경우
score[k-1] *=2; // 현재 저장된 스코어만 x2배
}else if(j>1){ // 두번째 혹은 세번째 숫자일경우
score[k-1] *=2; // 이전 점수 x2배
score[k-2] *=2; // 현재 점수 x2배
}
break;
case '#' :
score[k-1] *= -1; // 현재 숫자만 -1배
break;
}
}
}
for(int i=0; i<score.length; i++){
answer +=score[i];
System.out.print(score[i]+",");
}
return answer;
}
}
주요 핵심 포인트
1. charAt을 사용해 문자열에 저장된 문자가 숫자인지 문자인지를 구별하였다.
2. Character.isDisit 를 사용해 문자가 숫자인지를 판별하였다.
3. 숫자일 경우 getNumericValue를 사용해 문자를 숫자로 변환하여 저장하였다.
4. 숫자가 아닌경우 S D T 는 Math.pow를 사용해 제곱해주었다.
5. * 인 경우 이전 스코어와 현재 스코어에 *2배를 하였다.
6. #인 경우 현재 스코어에만 -1배를 곱하였다.
리뷰
: 카카오 코딩테스트 문제는 아직 제한된 시간내에 풀기에 부족하다는 생각이 들었다.
이 문제를 손쉽게 풀기 위하여 좀 더 많은 노력을 기울여야겠다는 생각을 하였다.
코딩 테스트를 준비하는 모든 분들이 성공하였으면 좋겠다.
'프로그래머스(JAVA)' 카테고리의 다른 글
[1차] 비밀지도 (0) | 2022.04.24 |
---|---|
가운데 글자 가져오기 (0) | 2022.04.24 |
같은 숫자는 싫어 (0) | 2022.04.24 |
나누어 떨어지는 숫자 배열 (0) | 2022.04.24 |
두 정수 사이의 합 (0) | 2022.04.24 |