-
프로그래머스: 다트 게임코딩테스트 문제 풀이/다시 풀어볼 문제 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]; } }
분석중 🤓
'코딩테스트 문제 풀이 > 다시 풀어볼 문제' 카테고리의 다른 글
백준: 재귀 의 귀재 (0) 2023.12.05 프로그래머스 : l로 만들기 (0) 2023.12.04 프로그래머스: 다리를 지나는 트럭 (0) 2023.11.25 백준: 스타트링크 (0) 2023.11.24 프로그래머스: 전화번호 목록 (0) 2023.11.23