본문 바로가기
코딩테스트/카카오

다트 게임

by 일상 속 둔치 2020. 3. 22.

출처 : 프로그래머스
출처 : 프로그래머스

String에서 원하는 정보를 Parsing하는 문제이다. 입력 형식이 점수,보너스,옵션(선택)인 문자열이 붙어서 나열되어있다.

 

이때 고려해야 하는 점은 점수가 0~9까지는 1자리 이지만 10까지 고려해야한다는 점(1이나왔지만 바로 다음 문자가 보너스가 아닐 수도 있음) 그리고 옵션이 항상 있는 것은 아니라는 점이다.

 

이 문제를 해결하기 위해 점수 1세트를 클래스로 정의하고 먼저 Parsing을 시도하였다.

class Score {
	int score;
	char bonus;
	char opt;
	
	Score(){
		score = 0;
		bonus = 'S';
		opt = 'N';
	}
}

 

문자열에서 점수를 얻어오는 함수이다.

	  public int getScore(int start, String str) {
		  int score=0;
		  
		  if(str.charAt(start) == '1') {
			  if(start+1 < str.length()) {
				  if(str.charAt(start+1) == '0') { // 10
					  score = 10;
				  }
				  else {
					  score = 1;
				  }
			  }
			  else {
				  score = 1;
			  }
		  }
		  else {
			  score = str.charAt(start) - '0';
		  }
		  
		  return score;
	  }

 

이후 보너스와 옵션도 Parsing 해주었다.

	while(top < dartResult.length()) {
	    	  score = new Score();
	    	  score.score = getScore(top,dartResult);
	    	  if(score.score == 10) {
	    		  top += 2;
	    	  }
	    	  else {
	    		  top++;
	    	  }
	    	  score.bonus = dartResult.charAt(top);
	    	  top++;
	    	  
	    	  /* 옵션이 있다면 */
	    	  if(top < dartResult.length()) {
		    	  if(dartResult.charAt(top)-'0'<0 || dartResult.charAt(top)-'0'>9) {
		    		  score.opt = dartResult.charAt(top);
		    		  top++;	    		  
		    	  }
	    	  }
	    	  scoreList.add(score);
    	  }

 

마지막으로 점수 계산을 위해서 점수만 들어있는 배열을 만들고 각 보너스와 옵션에 맞게 계산해주었다. (배열 추가 생성 없이 기존에 Score ArrayList로 하는 것이 메모리 측면에서 더 좋을지 모르겠지만 읽기 쉬운 코드를 위해 하나 생성)

 

아래는 코드 전문이다.

import java.util.*;

class Solution {
	  public int solution(String dartResult) {
	      int answer = 0;
	      int top = 0;
	      ArrayList<Score> scoreList = new ArrayList<>();
	      Score score;
	    
	      while(top < dartResult.length()) {
	    	  score = new Score();
	    	  score.score = getScore(top,dartResult);
	    	  if(score.score == 10) {
	    		  top += 2;
	    	  }
	    	  else {
	    		  top++;
	    	  }
	    	  score.bonus = dartResult.charAt(top);
	    	  top++;
	    	  
	    	  /* 옵션이 있다면 */
	    	  if(top < dartResult.length()) {
		    	  if(dartResult.charAt(top)-'0'<0 || dartResult.charAt(top)-'0'>9) {
		    		  score.opt = dartResult.charAt(top);
		    		  top++;	    		  
		    	  }
	    	  }
	    	  scoreList.add(score);
    	  }
	      
	      int[] scoreArr = new int[scoreList.size()];
	      
	      for(int i = 0; i < scoreArr.length; i++) {
	    	  // bonus
	    	  if(scoreList.get(i).bonus == 'S') {
	    		  scoreArr[i] = scoreList.get(i).score; 
	    	  }
	    	  else if(scoreList.get(i).bonus == 'D') {
	    		  scoreArr[i] = scoreList.get(i).score * scoreList.get(i).score;
	    	  }
	    	  else {
	    		  scoreArr[i] = scoreList.get(i).score * scoreList.get(i).score * scoreList.get(i).score;
	    	  }
	    	  //option
	    	  if(scoreList.get(i).opt == '*') {
	    		  scoreArr[i] *= 2;
	    		  if(i != 0) {
	    			  scoreArr[i-1] *= 2;
	    		  }
	    	  }
	    	  else if(scoreList.get(i).opt == '#') {
	    		  scoreArr[i] *= -1;
	    	  }
	    	  else {
	    		  continue;
	    	  }
	      }
	      
	      for(int i = 0; i < scoreArr.length; i++) {
	    	  answer += scoreArr[i];
	      }
	      
	      return answer;
	  }
	  
	  public int getScore(int start, String str) {
		  int score=0;
		  
		  if(str.charAt(start) == '1') {
			  if(start+1 < str.length()) {
				  if(str.charAt(start+1) == '0') { // 10
					  score = 10;
				  }
				  else {
					  score = 1;
				  }
			  }
			  else {
				  score = 1;
			  }
		  }
		  else {
			  score = str.charAt(start) - '0';
		  }
		  
		  return score;
	  }
}

class Score {
	int score;
	char bonus;
	char opt;
	
	Score(){
		score = 0;
		bonus = 'S';
		opt = 'N';
	}
}

'코딩테스트 > 카카오' 카테고리의 다른 글

뉴스 클러스터링  (0) 2020.03.29
문자열 압축  (0) 2020.03.29
실패율  (0) 2020.03.22
비밀지도  (0) 2020.03.21

댓글