본문 바로가기
문제풀이/프로그래머스

다트게임 / 프로그래머스 연습문제 / programmers / level1 / Java

by RUCKUS 2021. 7. 4.

https://programmers.co.kr/learn/courses/30/lessons/17682

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr


이번문제는 다양한 방식으로 풀이가 가능한 것 같았다.

후...어제 과음을 해서 그런가 생각이 길게 이어지지 않아서...코드가 조금 복잡할지라도 순차적으로 해결하려고 노력했다.

 

[알고리즘 Flow]

1. 각각의 점수를 분해하여 list 배열에 담아준다. (1S*, 2D# ... 이런식으로)

2. list.size 만큼 for문으로 각각의 점수를 계산한다.

3. *일경우에는 i > 0 크면 i - 1과 i번지의 숫자들을 x2해준다. i == 0 이면 해당 i만 x2

 

[작성코드]

package com.level01;

import java.util.ArrayList;
import java.util.List;

public class DartGame {

	public static void main(String[] args) {
		
		solution("1S2D*3T");
		
	}
	
    public static int solution(String dartResult) {
        int answer = 0;
        
        List<String> list = new ArrayList<String>();
        // 각각의 점수결과를 담을리스트
        String res = "";
        for (int i = 0; i < dartResult.length(); i++) {
        	res += dartResult.charAt(i);
        	if (res.length() == 2) {
        	// res의 길이가 2라면 (1S or 10 이런식으로 저장되어있을 것)
        		
        		if (res.equals("10")) {
        			// 점수가 10인경우에는 바로 뒤에 보너스를 더해서 리스트에 더한다.
            		res += dartResult.charAt(i+1);
            		list.add(res);
            		res = "";
            		i++;
        		} else {
               		if (i < dartResult.length()-1) {
               		// 아웃오브바운즈 방지
                		if (dartResult.charAt(i+1) == '*' || dartResult.charAt(i+1) == '#') {
                    		res += dartResult.charAt(i+1);
                    		list.add(res);
                    		res = "";
                    		i++;
                    	} else {
                    		list.add(res);
                    		res = "";
                    	}
            			
            		} else if (i == dartResult.length()-1) {
            			// 마지막 번지 일 경우
                		list.add(res);
                		res = "";
            		}
        		}
        		
 
        	}

		}
        List<Integer> score = new ArrayList<Integer>();
        // 점수를 담을 리스트
        for (int i = 0; i < list.size(); i++) {
        // 각각의 점수를 합산하자.
        	int point = Character.getNumericValue(list.get(i).charAt(0));
        	// 각 라운드의 포인트를 가져온다
        	if (list.get(i).charAt(1) == 'D') {
        		point = point * point;
        	} else if (list.get(i).charAt(1) == 'T') {
        		point = point * point * point;
        	} else if (list.get(i).charAt(1) == '0') {
        		// 점수가 10점인 경ㅇ
        		String ten = "";
        		ten += list.get(i).charAt(0);
        		ten += list.get(i).charAt(1);
        		point = Integer.parseInt(ten);
        		if (list.get(i).charAt(2) == 'D') {
        			point = point * point;
        		} else if (list.get(i).charAt(2) == 'T') {
        			point = point * point * point;
        		}
        	}
        	score.add(point);
		}
        
        for (int i = 0; i < list.size(); i++) {
			
        	if (list.get(i).length() == 3) {
        			
        		if (list.get(i).charAt(2) == '*') {
        			score.set(i, score.get(i) * 2);
        			if (i > 0) {
        				score.set(i-1, score.get(i-1) * 2);
        			}
        		} else if (list.get(i).charAt(2) == '#') {
        			score.set(i, score.get(i) * -1);
        		} 
        		
        	}
        	
		}
        
        for (int i = 0; i < score.size(); i++) {
        	answer += score.get(i);
		}
        return answer;
    }
    
	
}

 

생각보다 약간 노가다 느낌이다... 하튼 일단 푼거로 만족한다. 숙취해소하러가야징~


[깃허브링크]

https://github.com/RUCKUSJERRY/practiceOfAlgorithm/blob/main/Prs_Pratice/src/com/level01/DartGame.java

 

RUCKUSJERRY/practiceOfAlgorithm

Contribute to RUCKUSJERRY/practiceOfAlgorithm development by creating an account on GitHub.

github.com