문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/17682
코딩테스트 연습 - [1차] 다트 게임
programmers.co.kr
문제 설명 :
카카오톡에 뜬 네 번째 별! 심심할 땐? 카카오톡 게임별~
카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.
0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.
입력 형식 :
점수|보너스|[옵션]으로 이루어진 문자열 3세트.
예) 1S2D*3T
출력 형식 :
3번의 기회에서 얻은 점수 합계에 해당하는 정수값을 출력한다.
예) 37
입출력 예 :
코드 :
import java.util.ArrayList;
class Solution {
public static String[] splitdart(String str) {
ArrayList<String> tmp1 = new ArrayList<>();
// 10이 있는지 확인 없으면 -1 리턴
int index =str.indexOf("10");
int index2 =str.indexOf("10", index+1);
int index3 =str.indexOf("10", index2+1);
for(int i = 0; i<str.length(); i ++)
{
if(index != -1 && index == i)
{
tmp1.add(str.substring(i, i+2));
}else if(index2 != -1 && index2 == i)
{
tmp1.add(str.substring(i, i+2));
}else if(index3 != -1 && index3 == i)
{
tmp1.add(str.substring(i, i+2));
}else {
tmp1.add(str.substring(i, i+1));
}
}
// 10을 두자리로 자르고 나머지 를 한자리씩 하기 때문에 필요없는 0이 추가되어 있어서 제거
for(int i =0; i<tmp1.size(); i++)
{
if(tmp1.get(i).equals("10") && tmp1.get(i+1).equals("0")) // 10다음의 0만 제거한다.
{
tmp1.remove(i+1);
}
}
// String 배열화 시킨다.
String[] strArr = new String[tmp1.size()];
for(int i =0; i<tmp1.size(); i++)
{
strArr[i] = tmp1.get(i);
}
return strArr;
}
public int solution(String dartResult) {
int answer = 0;
String[] dartResultSplit = splitdart(dartResult);
ArrayList<Integer> point = new ArrayList<>();
// 점수는 3회분뿐
try {
for(int i =0 ; i<dartResultSplit.length; i++)
{
if(dartResultSplit[i].equals("S"))
{
point.add(((int) Math.pow(Integer.parseInt(dartResultSplit[i-1]),1 ))) ; // Math.pow type : double
}
if(dartResultSplit[i].equals("D"))
{
point.add(((int) Math.pow(Integer.parseInt(dartResultSplit[i-1]),2 ))); // Math.pow type : double
}
if(dartResultSplit[i].equals("T"))
{
point.add(((int) Math.pow(Integer.parseInt(dartResultSplit[i-1]),3 ))); // Math.pow type : double
}
if(dartResultSplit[i].equals("*"))
{
int j ;
if(i <dartResultSplit.length-1)
// j의 값이 0,1,2 이기 때문에 루트를 씌워서 -1을 할지 그냥둘지 파악한다.
// dartResultSplit.length-1 보다 작은경우는 -1을 해주고 아니먄 그냥 둔다.
{
j = (int)Math.sqrt(i)-1;
// *이 나오는 최소 수는 2이고 이 경우 첫번째 수만 *2를 해줘야한다.
// 그래서 루트 2는 1.3이기 때문에 -1을 해줘야 0인 인뎃스 값을 넣을 수 있다.
}else
{
j = (int)Math.sqrt(i);
}
System.out.println(j);
if(j !=0 )
{
point.set(j, point.get(j)*2);
point.set(j-1, point.get(j-1)*2);
}else
{
point.set(j, point.get(j)*2);
}
}
if(dartResultSplit[i].equals("#"))
{
point.set((int)Math.sqrt(i-2), (point.get((int)Math.sqrt(i-2)) *(-1))) ;
// System.out.println(point.get((int)Math.sqrt(i-1)));
}
}
}catch (NumberFormatException e) {
}catch (Exception e) {
}
// for(int i = 0 ; i<point.size();i++)
// {
// System.out.println(point.get(i));
// }
for(int i : point)
{
answer+=i;
}
return answer;
}
}
결과 :
댓글 영역