algorithm/programmers

[프로그래머스/자바] 다트 게임 풀이 - 2018 KAKAO BLIND RECRUITMENT

hsm914 2022. 11. 28. 15:26
728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2018 KAKAO BLIND RECRUITMENT 1차 Level 1 문제다.

 

 

점수, 보너스, 옵션 순서대로 문자열이 구성되어 있으므로 for문을 통해 문자열의 값 하나하나 탐색하면 쉽게 풀 수 있다.

점수가 두자리(10)인 경우도 있으므로 StringBuilder를 사용해 1 다음 0을 append할 수 있도록 했다.

 

그리고 보너스를 만나면 점수가 다 StringBuilder에 저장되어 있는 형태이므로

ArrayList에 저장하고 StringBuilder를 비워준다.

보너스가 어떤 것인지에 따라 ArrayList의 가장 끝에 있는 값을 바꿔준다.

 

옵션 *를 만나면 ArrayList의 가장 끝 값, 끝에서 두번째 값을 2 곱해준다.

이때 size가 1인 경우 끝에서 두번째 값을 접근하면 오류가 나므로 1보다 큰 경우만 끝에서 두번째 값을 곱해준다.

 

옵션 #를 만나면 ArrayList의 가장 끝 값을 -1 곱해준다.

가장 끝 값의 인덱스를 접근하기 위해 size를 나타내는 변수를 따로 만들고

ArrayList에 StringBuilder의 값을 더해줄 때마다 size를 1씩 더해줬다.

 

 

배운점 및 느낀점

ArrayList의 set 함수를 통해 해당 인덱스의 값을 변경할 수 있다는 걸 새롭게 알았다!

 

 

 

import java.util.*;

class Solution {
    public int solution(String dartResult) {
        ArrayList<Integer> num = new ArrayList<>();
        StringBuilder sb = new StringBuilder();
        int size = 0;
        
        for(char c : dartResult.toCharArray()) {
            if(c >= '0' && c <= '9') // 숫자인 경우
                sb.append(c);
            else if(c >= 'A' && c <= 'Z') { // 보너스인 경우
                num.add(Integer.parseInt(sb.toString()));
                sb.setLength(0);
                size++;
                
                if(c == 'S')
                    continue;
                else if(c == 'D') 
                    num.set(size - 1, (int)Math.pow(num.get(size - 1), 2));
                else if(c == 'T') 
                    num.set(size - 1, (int)Math.pow(num.get(size - 1), 3));
            }
            else {
                if(c == '*') { // 옵션인 경우
                    num.set(size - 1, num.get(size - 1) * 2);
                    if(size != 1)
                        num.set(size - 2, num.get(size - 2) * 2);
                }
                else if(c == '#') {
                    num.set(size - 1, num.get(size - 1) * -1);
                }
            }
            
        }
        
        return num.get(0) + num.get(1) + num.get(2);
    }
}
728x90