Today
-
Yesterday
-
Total
-
  • 프로그래머스: 다트 게임
    코딩테스트 문제 풀이/다시 풀어볼 문제 2023. 11. 26. 00:01

    으아 ㅠㅠ 이 문제 난이도 라는데..😭 못 풀었다. 졸면서 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];
      }
    }

    분석중 🤓

Designed by Tistory / Custom by 얼거스