반응형
아래는 문제 링크입니다.
https://programmers.co.kr/learn/courses/30/lessons/17682
처음에 문제를 제출했을 때 오류가 발생했다.
문제를 생각해보니 모든 글자를 잘라 배열에 담으므로 10같은 경우가 1과 0 으로 담기므로 오류가 발생했다.
이 부분에서 좀 고민을 한 것 같다. 아래는 처음 작성한 답안인데 코드가 좀 더럽다..
class Solution{
public int solution(String dartResult) {
int answer = 0;
ArrayList<String> arr = new ArrayList<>();
ArrayList<Integer> score = new ArrayList<>();
String[] split = dartResult.split("");
String s = "";
for(int i = 0; i < split.length; i++){
if(Character.isDigit(split[i].charAt(0))){
s += split[i].charAt(0);
}
else{
arr.add(s);
arr.add(split[i]);
s = "";
}
}
for(int i = 0; i < arr.size() ; i++){
if(arr.get(i).equals("S")){
int num = Integer.parseInt(arr.get(i - 1));
score.add(num);
}
else if(arr.get(i).equals("D")){
int num = Integer.parseInt(arr.get(i - 1));
score.add(num * num);
}
else if(arr.get(i).equals("T")){
int num = Integer.parseInt(arr.get(i - 1));
score.add(num * num * num);
}
else if(arr.get(i).equals("*")){ // 두배 두배
if(score.size() == 1){ //첫번째 자리라면
int num = score.get(score.size() - 1);
score.remove(score.size() - 1);
score.add(num * 2);
}
else { //그 뒤라면
int num2 = score.get(score.size() - 2);
int num1 = score.get(score.size() - 1);
score.remove(score.size() - 2); //안에 껄 먼저 삭제
score.remove(score.size() - 1);
score.add(num2 * 2);
score.add(num1 * 2);
}
}
else if(arr.get(i).equals("#")){
int num = score.get(score.size() - 1);
score.remove(score.size() - 1);
score.add(num * - 1 );
}
}
for (int i : score) {
answer += i ;
}
return answer;
}
}
너무 불필요하고 장황하게 코드를 짠 것 같다.
그래서 이번에는 숫자가 총 3개가 들어온다는 아이디어를 이용해서 다르게 풀어보았다.
import java.util.*;
class Solution {
public int solution(String dartResult) {
int answer = 0;
ArrayList<String> arr = new ArrayList<>();
String[] word = dartResult.split("");
int[] score = new int[3];
String[] split = dartResult.split("[SDT*#]");
int z = 0;
for (String s : split) {
if(!s.equals("")){
score[z++] = Integer.parseInt(s);
}
}
int seq = 0;
for(int i = 0; i < word.length ; i++){
if(word[i].equals("S")){
seq++;
}
else if(word[i].equals("D")){
int num = score[seq];
score[seq] = num * num;
seq++;
}
else if(word[i].equals("T")){
int num = score[seq];
score[seq] = num * num * num;
seq++;
}
else if(word[i].equals("*")){ // 두배 두배
if(seq - 1 == 0){ //첫번째 자리라면
int num = score[seq - 1];
score[seq - 1] = num * 2;
}
else { //그 뒤라면
int num2 = score[seq - 2];
int num1 = score[seq - 1];
score[seq - 2] = num2 * 2;
score[seq - 1] = num1 * 2;
}
}
else if(word[i].equals("#")){
int num = score[seq - 1];
score[seq - 1] = num * -1;
}
}
for (int i : score) {
answer += i ;
}
return answer;
}
}
이전보다는 훨씬 깔끔하게 푼 것 같다. 시간 제한은 30분을 조금 넘겨 버렸다. 아쉽지만 실패..
다음번에 더 줄이도록 노력해보자.
반응형
댓글