공부블로그
[프로그래머스] 1차 다트게임 본문
https://school.programmers.co.kr/learn/courses/30/lessons/17682
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[문제풀이]
- 다트 게임 횟수 == 총3회,
회차 별 점수 계산하기 위해 int[]을 선언한다.
이때 회차와 인덱스를 맞추기 위해 길이를 4로 정한다.
- 주어진 String을 char[]로 만들어 for each문으로 하나하나 가리킨다.
- int idx는 게임 회차를 의미한다.
- flag가 true가 되면 회차변경 (idx증가)한다.
- for each문
c가 아스키 코드 48 ~ 57의 값일 때 (숫자일 때)
1. 점수 계산하는 변수 answer에 값을 넣어준다.
이때 점수가 두자리일 경우를 대비해 10을 곱해 자리수를 늘리고 c-48값을 더한다.
* c - 48인 이유: 아스키 코드 48은 숫자 0을 의미한다. 따라서 계산을 하면 아스키 코드c가 의미하는 숫자가 나온다.
2. 회차가 변경되는 기준은 보너스 영역(S/D/T) 또는 옵션 ('*' / '#')이 나온 후 숫자가 나올 때
flag=true이면 보너스와 옵션 계산의 완료를 의미하므로 idx값을 증가시켜 회차 변경한다.
c >= 68 일 때(보너스 계산)
1. D=68, S=83, T=84
2. D일때 제곱, T일때 세제곱 연산을 하고 flag=false로 바꾼다.
옵션 계산
1. '*' = 42, '#' = 35
2. 매개변수로 회차수, 곱해야 하는 값을 넘겨준다.
해당 회차 점수에 곱할 값을 곱하고
만약 곱해야하는 값이 2일경우 스타상('*')이기 때문에
이전 회차에도 2를 곱한다.
이때 answer[]의 길이를 3회차+1으로 설정했고, 시작인덱스를 1부터 사용했기때문에
배열이 초과되는 일은 없다.
import java.util.Arrays;
class Solution {
public static int[] answer = new int[4];
public static char[] ch;
public static int solution(String dartResult) {
ch = dartResult.toCharArray();
int idx = 1;
boolean flag = false; //회차 변경 플래그 defualt: false
for(int c: ch) {
if(c > 47 && c < 58) { // 숫자 (48 ~ 57)
if(flag == true) {
flag = false;
idx++; //회차 변경
}
answer[idx]=answer[idx]*10+(c-48);
}else if(c >= 68) { //
flag = bonus(idx, c);
}else { //option영역: 스타상(*)=42, 아차상(#)=35
int num = 2;
if(c==35) num = -1;
flag = option(idx, num);
}
}
int sum = 0;
for(int num: answer)
sum += num;
return sum;
}//solution
public static boolean option(int idx, int num) {
answer[idx] *= num;
if(num == 2) answer[idx-1] *= 2; //스타상 (*)
return true;
}//option
public static boolean bonus(int idx, int c) {
if(c == 68) { // 보너스: D
answer[idx] *= answer[idx];
}else if(c == 84) { // 보너스: T
answer[idx] = answer[idx] * answer[idx] * answer[idx];
}
return true;
}//bonus
}
숫자를 판별할 때 위 조건대신 isDigit()를 사용해도 됨
'IT > 알고리즘' 카테고리의 다른 글
[백준] 10817 (0) | 2022.09.18 |
---|---|
[백준] 2750 (0) | 2022.09.18 |
[백준] 9012번 괄호 (0) | 2022.08.24 |
[백준] 9093번 단어 뒤집기 (0) | 2022.08.22 |
[프로그래머스] 체육복 (0) | 2022.08.18 |