-
728x90
전체 코드는 맨 밑에 있어요 :)
1. 처음은 무조건 숫자의 입력을 받는다.
숫자가 한자리 수가 아닐 수 있기 때문에 while문과 isDigit를 이용해서 숫자를 담은 문자열을 만든다.
StringBuilder sb = new StringBuilder(); while(Character.isDigit(dartResult.charAt(i))) sb.append(dartResult.charAt(i++));
int n = Integer.parseInt(sb.toString());
2. 다음 문자의 입력을 받고 'S', 'D', 'T'에 따라 각각 1제곱, 2제곱, 3제곱한 값을 구한다.
Map에 각 점수마다 제곱할 값을 담아놓고
HashMap<Character, Integer> score = new HashMap<Character, Integer>(); score.put('S', 1); score.put('D', 2); score.put('T', 3);
Math.pow()함수를 이용하여 제곱한 값을 구한다.3. 옵션이 존재하지 않을 수 있으므로, 다음 문자가 숫자가 아니면 옵션인 것으로 간주한다.
다음 문자를 확인하기 전에, 현재가 마지막 문자인 경우 stack에 값을 넣고 종료시켜주었다.
ㄴ 현재 뒤 문자가 없는데 확인하려 하기때문에 nullPointException이 날 수 있기 때문
if (i + 1 >= dartResult.length()) { num.add(n); continue; }
4. 옵션에 따라 처리를 해주고 stack에 계산한 값을 넣는다.
뒤가 옵션인 경우 => isDigit(option)이 false인 경우
- * 인 경우 : 자기 자신을 2배한 값을 넣는다. => 비었든 안 비었든 공통!!
ㄴ stack이 빈 것이 아닌 경우 : 맨 위의 값(이전의 값)을 꺼내 2배한 뒤 다시 넣는다.
- #인 경우 : 자신의 값을 뺀다.
char option = dartResult.charAt(i + 1); if (!Character.isDigit(option)) { if (option == '*') { if (!num.isEmpty()) num.add(num.pop() * 2); num.add(n * 2); } else num.add(-n); i++; // 옵션문자로 위치를 옮겨주기 위해, 그래야 for문에 의해 ++되면 숫자를 가리킨다. } else num.add(n);
옵션이 아니고 숫자인 경우 => 그냥 지금까지 계산한 값을 stack에 넣어둔다.
5. stack에서 하나씩 꺼내면서 answer에 더한다.
[ 전체 코드 ]
import java.util.HashMap; import java.util.Stack; class Solution { public int solution(String dartResult) { int answer = 0; HashMap<Character, Integer> score = new HashMap<Character, Integer>(); score.put('S', 1); score.put('D', 2); score.put('T', 3); Stack<Integer> num = new Stack<Integer>(); for (int i = 0; i < dartResult.length(); i++) { StringBuilder sb = new StringBuilder(); while(Character.isDigit(dartResult.charAt(i))) sb.append(dartResult.charAt(i++)); int n = Integer.parseInt(sb.toString()); // 숫자 n = (int) Math.pow(n, score.get(dartResult.charAt(i))); // n제곱 // 마지막에 옵션 없는 경우 => 종료 if (i + 1 >= dartResult.length()) { num.add(n); continue; } // 옵션 처리 char option = dartResult.charAt(i + 1); if (!Character.isDigit(option)) { if (option == '*') { if (!num.isEmpty()) num.add(num.pop() * 2); num.add(n * 2); } else num.add(-n); i++; } else num.add(n); } while (!num.isEmpty()) answer += num.pop(); return answer; } }
'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
[level1] 프로그래머스 - 문자열 내 p와 y의 개수(JAVA) (0) 2021.08.30 [level1] 프로그래머스 - 두 정수 사이의 합(JAVA) (0) 2021.08.30 [level1] 프로그래머스 - 가운데 글자 가져오기(JAVA) (0) 2021.08.29 [level1] 프로그래머스 - 비밀지도(JAVA) (0) 2021.08.29 [level1] 프로그래머스 - 2016년(JAVA) (0) 2021.08.29 댓글