다희의 코딩 성장일기
[프로그래머스] level1. [1차] 다트 게임 (자바 JAVA) 본문
[ 문제 ] [프로그래머스] level1. [1차] 다트 게임 (자바 JAVA)
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17682
# 접근 방법 및 풀이
- 먼저 주어진 문자열에서 10을 어떻게 처리할지 고민이었다. 보통 숫자는 0~9까진데 여기선 10점까지 있기 때문이다.
- 그래서 String.charAt()해서 해당 문자가 정수면 뒤에꺼까지 고려하는 부분도 있지만 귀찮아서 걍 치환하기로 했다.
- replace("10", "k"); 이렇게 10을 k로 치환했다. 그리고 다음과 같이 점수, 보너스, 옵션에 대한 String을 만들었다.
- String score = "0123456789k";
String bonus = "SDT";
String option = "*#"; - dartResult.split("")로 String형태의 배열로 만들고 차례대로 살펴보면된다.
- 그다음은 Stack을 이용해서 풀면된다.
- 숫자면 스택에 넣고, 보너스가 나오면 pop()해서 보너스에 따라 제곱해주면된다.
- 옵션일때는 주의해야할 건 "*"이다. 이건 해당점수와 이전 점수까지 2배를 해주는데, 만약 첫번째 기회에 나온다면 해당점수만 해주어야한다. 여기에 대한 분기가 필요하다.
- 근데 다 풀고 체점 돌리니까 18번이랑 22번이 틀렸다...? 띠용하고 뭐가 문제지 하고 결국 질문하기 찾아봤다.
- "*" 이 부분에서 틀렸는데......오마이갓....... 스택은 LIFO라는걸...까먹은건지....
- "*" 일땐 스택에서 pop을 다음과 같이 두번 했다.
- int num = stack.pop()*2;
int num2 = stack.pop()*2; - 그렇다면 넣는 순서는 어떻게 될까 ^^....?
- 멍청하게 첫번째 꺼낸 num을 먼저 넣어버렸다. LIFO이므로 첫번째 꺼낸건 다음에 넣어야하는데말이다.....허허....
- 이부분 고쳤더니 맞았다! 스택을 너무 쉽게 pop하고 아무생각 없이 쓰다보니 이런 허점이.. 충격이었다.
# 주의할 점
- 점수가 0~9가 아닌 0~10까지인 점
- "*" 일때 스택에서 두번 pop했다면 다시 넣을 순서 고려. LIFO임
- 스택 넣을때 뺄때 잘 고려해서 풀기
JAVA 코드
import java.util.*;
class Solution {
public int solution(String dartResult) {
int answer = 0;
Stack<Integer> stack = new Stack<>();
dartResult = dartResult.replace("10", "k");
String score = "0123456789k";
String bonus = "SDT";
String option = "*#";
String arr[] = dartResult.split("");
for(int i = 0; i < arr.length; i++){
String s = arr[i];
if(score.contains(s)){
int num = (s.equals("k"))? 10 : Integer.parseInt(s);
stack.add(num);
}
if(bonus.contains(s)){
int num = stack.pop();
if(s.equals("D")){
num = (int) Math.pow(num, 2);
}
if(s.equals("T")){
num = (int) Math.pow(num, 3);
}
stack.add(num);
}
if(option.contains(s)){
if(s.equals("*")){
if(stack.size()==1){
int num = stack.pop()*2;
stack.add(num);
}else{
int num = stack.pop()*2;
int num2 = stack.pop()*2;
stack.add(num2);
stack.add(num);
}
}
if(s.equals("#")){
int num = stack.pop()*-1;
stack.add(num);
}
}
}
while(!stack.isEmpty()){
answer += stack.pop();
}
return answer;
}
}
REVIEW
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스 SQL] level2. 이름에 el이 들어가는 동물 찾기 (MySQL) (0) | 2021.08.26 |
---|---|
[프로그래머스 SQL] level2. 루시와 엘라 찾기 (MySQL) (0) | 2021.08.26 |
[프로그래머스] level2. 튜플 (자바 JAVA) (0) | 2021.08.26 |
[프로그래머스] level2. 방문 길이 (자바 JAVA) (0) | 2021.08.25 |
[프로그래머스] level2. 영어 끝말잇기 (자바 JAVA) (0) | 2021.08.25 |
Comments