[1차] 다트 게임

2022. 6. 7. 17:28·코딩테스트/프로그래머스
반응형

아래는 문제 링크입니다.

https://programmers.co.kr/learn/courses/30/lessons/17682

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr

 

처음에 문제를 제출했을 때 오류가 발생했다.

문제를 생각해보니 모든 글자를 잘라 배열에 담으므로 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분을 조금 넘겨 버렸다. 아쉽지만 실패..

다음번에 더 줄이도록 노력해보자.

반응형
'코딩테스트/프로그래머스' 카테고리의 다른 글
  • 더 맵게
  • 실패율
  • 신고 결과 받기
  • SQL 문제 - 우유와 요거트가 담긴 장바구니
Debin
Debin
공부 기록을 남기며 게시글 리팩토링을 진행하는 블로그입니다.
  • Debin
    리팩토링하는 블로그
    Debin
  • 전체
    오늘
    어제
    • 분류 전체보기
      • DB
        • DB 기초
        • MySQL
        • SQL 튜닝
      • OS
      • Network
      • Git
      • 디지털콘텐츠기획
      • 소프트웨어공학
      • 코딩테스트
        • 프로그래머스
        • 백준
        • 인프런
      • 공부 일지
      • 독서
        • 클린코드
        • 일상 속 사물이 알려주는 웹 API 디자인
        • 토비의 스프링
        • 객체지향의 사실과 오해
        • 자바 잘 읽는 법
      • 기록 및 회고
      • Cloud
        • AWS
      • 개발
        • Java
        • Spring Core
        • Spring MVC
        • Spring DB
        • Spring Boot
        • Spring Security
        • Spring Batch
        • JPA
        • Test
        • Android
      • 대외활동
        • UMC SERVER
        • 카엔프 SW 아카데미
      • 프로젝트
      • Docker
      • Gradle
      • ELK
      • 실무 이야기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

    • 본인 깃허브입니다!
  • 인기 글

  • 태그

    SQL
    스프링
    redis
    스프링 부트
    컨테이너
    객체
    spring boot
    container
    spring
    트랜잭션
    AOP
    자바
    프록시
    AWS
    test
    JPA
    mysql
    innodb
    인덱스
    토비의 스프링
    ORM
    docker
    코딩 #개발자 #노마드북클럽 #노개북
    객체지향
    도커
    Java
    리눅스
    운영체제
    spring mvc
    데이터베이스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Debin
[1차] 다트 게임
상단으로

티스토리툴바