프로그래머스: 다트 게임

김아무개·2023년 4월 25일
0

다시 풀어볼 문제

목록 보기
6/8

으아 ㅠㅠ 이 문제 난이도 라는데..😭
못 풀었다.
졸면서 40분 고민한것 같다ㅠㅠ
답을 찾을 수 없다고 판단해서 chat에게 코드를 부탁함.. 🙈

Chat 코드

class Solution {
    public int solution(String dartResult) {
        int[] score = new int[3];
        int idx = 0;

        for (int i = 0; i < dartResult.length(); i++) {
            char c = dartResult.charAt(i);

            if (Character.isDigit(c)) {
                if (c == '1' && dartResult.charAt(i + 1) == '0') {
                    score[idx] = 10;
                    i++;
                } else {
                    score[idx] = c - '0';
                }
            } else if (c == 'S' || c == 'D' || c == 'T') {
                if (c == 'D') {
                    score[idx] = (int) Math.pow(score[idx], 2);
                } else if (c == 'T') {
                    score[idx] = (int) Math.pow(score[idx], 3);
                }
                idx++;
            } else if (c == '*' || c == '#') {
                idx--;

                if (c == '*') {
                    score[idx] *= 2;
                    if (idx > 0) {
                        score[idx - 1] *= 2;
                    }
                } else {
                    score[idx] *= -1;
                }

                idx++;
            }
        }

        return score[0] + score[1] + score[2];
    }
}

나의 경우에는 10을 찾아낼 방법을 떠올리지 못해서 풀어내지 못했는데
이런 간단한 방법이 있었다니


공부공부 🤓✏️

if (Character.isDigit(c)) { // char 자료형이 숫자인지 판별
	if (c == '1' && dartResult.charAt(i + 1) == '0') {
		score[idx] = 10;
		i++;
	}
}

추가로 알아두면 좋을것 같은 Character 메서드

char toUpperCase(char ch): 문자 하나(ch)를 대문자로 변환해서 리턴
char toLowerCase(char ch): 문자 하나(ch)를 소문자로 변환해서 리턴

boolean isUpperCase(char ch): 문자가 대문자인지 판별해서 boolean 리턴
boolean isLowerCase(char ch): 문자가 소문자인지 판별해서 boolean 리턴

boolean isDigit(char ch): 숫자인지 판별해서 boolean 리턴
boolean isLetter(char ch): 문자인지 판별해서 boolean 리턴
boolean isWhitespace(char ch): 공백문자인지 판별해서 boolean 리턴

이외에도 다른 사람들이 작성한 정말 다양한 코드들이 있다.

프로그래머스 다른사람 풀이 1 : Stack 이용 _> 약간 수정함

import java.util.*;
class Solution {
    public int solution(String dartResult) {
        Stack<Integer> stack = new Stack<>();
        
        int sum = 0;
        for (int i = 0; i < dartResult.length(); ++i) {
            char c = dartResult.charAt(i);
            if (Character.isDigit(c)) {
                sum = (c - '0');
                if (sum == 1 && dartResult.charAt(i + 1) == '0') {
                    sum = 10;
                    i++;
                }
                stack.push(sum);
                
            } else {
                int prev = stack.pop();
                if (c == 'D') {
                    prev *= prev;
                
                } else if (c == 'T') {
                    prev = prev * prev * prev;
                
                } else if (c == '*') {
                    if (!stack.isEmpty()) {
                        int val = stack.pop() * 2;
                        stack.push(val);
                    }
                    prev *= 2;
                
                } else if (c == '#') {
                    prev *= (-1);
                }
                stack.push(prev);
            }
        }
        
        int totalScore = 0;
        while (!stack.isEmpty()) {
            totalScore += stack.pop();
        }
        
        return totalScore;
    }
}

프로그래머스 다른 사람 풀이 2 : Pattern 이용

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Solution {
    static int[] sum = new int[3];
    static int solution(String msg){
        String reg = "([0-9]{1,2}[S|T|D][*|#]{0,1})";
        Pattern p = Pattern.compile(reg+reg+reg);
        Matcher m = p.matcher(msg);
        m.find();
        
        for(int i=1; i<=m.groupCount(); i++){
            Pattern p1 = Pattern.compile("([0-9]{1,2})([S|T|D])([*|#]{0,1})");
            Matcher m1 = p1.matcher(m.group(i));
            m1.find();
            
            sum[i-1] = (int)Math.pow(Integer.parseInt(m1.group(1)), getpow(m1.group(2)));
            setting(i,m1.group(3));
        }
        
        return(sum[0]+ sum[1]+ sum[2]);
    }
    
    static void setting(int idx, String msg){
        if(msg.equals("*")){
            sum[idx - 1] *= 2;
            if(idx > 1 ){
                sum[idx - 2] *=2;
            }
            
        } else if(msg.equals("#")){
            sum[idx - 1] *=-1 ;
        }
    }
    static int getpow(String mag){
        if(mag.equals("S")){
            return 1; 
            
        } else if(mag.equals("D")){
            return 2;
            
        } else {
            return 3;
        }
    }


}

확실히 문자열 가공하는 방법은 실행 시간이 오래 걸리는것 같다.
그리고 Pattern 클래스는 한번도 사용해보지 않아서 너무 신기해..🙊

공부 필요 🤓✏️

프로그래머스 다른사람 풀이 3 : HashTable 이용

import java.util.Hashtable;

class Solution {
  public int solution(String dartResult) {
      int answer = 0;
        Hashtable<String, Integer> table = new Hashtable<>();
        table.put("S",1);
        table.put("D",2);
        table.put("T",3);

        int[] temp = new int[3];
        int num = 0;
        int count = 0;

        for(int i=0; i<dartResult.length(); i++) {
            String key = dartResult.charAt(i) + "";

            if(table.containsKey(key)) {
                num = (int)Math.pow(num, table.get(key));
                temp[count++] = num;
                num = 0;
                
            } else if(key.equals("*")) {
                if(count-2 >= 0) temp[count-2] *= 2; 
                temp[count-1] *= 2;
                
            } else if(key.equals("#")) {
                temp[count-1] *= -1;
                
            } else {
                if(num > 0) key = "10";
                num = Integer.parseInt(key);
            }
        }

        for(int i=0; i<temp.length; i++) {
            answer += temp[i];
        }

        return answer;
  }
}

오잉 해시 테이블은 금방 끝날 줄 알았는데 의외였다
내가 잘못 알고있는걸까? 🤔

프로그래머스 다른 사람 풀이 4 : char , switch 이용 _> 약간 수정함

class Solution {
  public int solution(String dartResult) {
      int length = dartResult.length();
      int[] score = {0, 0, 0};
      int index = -1;
      for (int i=0; i<length; i++) {
          char ch = dartResult.charAt(i);
          switch (ch) {
              case '0':
              case '1':
              case '2':
              case '3':
              case '4':
              case '5':
              case '6':
              case '7':
              case '8':
              case '9':
                  index++;
                  score[index] = ch - '0';
                  if ((ch == '1') && (dartResult.charAt(i+1) == '0')) {
                      score[index] *= 10;
                      i++;
                  }
                  break;
              case 'S':
              case 's':
                  break;
              case 'D':
              case 'd':
                  score[index] *= score[index];
                  break;
              case 'T':
              case 't':
                  score[index] *= score[index]*score[index];
                  break;
              case '*':
                  if (index == 0) {
                      score[index] *= 2;
                  } else {
                      score[index-1] *= 2;
                      score[index] *= 2;
                  }
                  break;
              case '#':
                  score[index] *= -1;
                  break;
              default:
                  return -1;
          }
      }
      return score[0]+score[1]+score[2];
  }
}

분석중 🤓

profile
Hello velog! 

0개의 댓글