본문 바로가기

Backend/프로그래머스-자바

[프로그래머스] Java - Level 1 | 다트게임 | PS일지

 

Problem Solving

```

[프로그래머스] 다트 게임 — Java

문제를 해결하며 사용한 핵심 아이디어와 주의할 점을 정리합니다.

```

문제 정보

```
플랫폼 프로그래머스
문제 다트 게임
난이도 Level 1
언어 Java
문제 링크 문제 바로가기 →
```

1. 문제 요약

다트를 3번 던진 결과를 짜야함. 문제 조건에 따라서 여러 이벤트가 있음.

2. 핵심 아이디어

핵심```

dartResult를 순회하며 그때 그때 처리하자O(N)

```

문제 봤을때 일단.. 다트 점수가 1~10까지 있어서, 점수가 두 자리인 경우도 있는게 까다로웠습니다.

정규표현식을 사용하면 좀 쉽게 토큰들을 뺄 수 있지만.. 정규 표현식을 잘 다루지 못하기 때문에 패스!

 

-> 숫자 이후에는 무저건 "SDT" 중 하나의 문자열이 들어옵니다.

이를 이용해서, dartResult 순회를 돌며 문자들을 받아서 처리 했습니다.

 

맵 같은 딕셔너리 활용하면 좋은거 같습니다.

주어진 특정 조건에 맞는 분기처리를 저는 contains를 활용해서 했습니당~

4. 풀이 코드

import java.util.*;

class Solution {
    public int solution(String dartResult) {
        Map<String, Integer> dic = Map.of("S",1, "D",2, "T",3);
        int answer = 0;

        String[] input = dartResult.split("");
        int [] darts = new int[3];
        int dartIdx = 0;
        String prevNum = "";

        for (int i =0; i<dartResult.length();i++) {
            String e = input[i];
            if ("SDT".contains(e)) {
                int point = Integer.parseInt(prevNum);
                darts[dartIdx++] = (int) Math.pow(point, dic.get(e));
                prevNum="";
            } else if ("#*".contains(e)) {
                if (e.equals("#")) {
                    darts[dartIdx-1]*=-1;
                    continue;
                }
                darts[dartIdx-1]*=2;
                if (dartIdx>1)
                    darts[dartIdx-2]*=2;
            } else {
                prevNum += e;
            }
        }
        return Arrays.stream(darts).sum();
    }   
}

 

5. 복잡도

시간 복잡도: O(N)

```

공간 복잡도: O(1)

```

포문 한번 돌아서

 

7. 회고

어려웠던 점

```

Java가 익숙치 않았습니다.

처음에 List로 접근 해봤는데 이건 아닌거같은.. 느낌이.. 배열 + idx로 접근 하는 방법 좋네요..

 

그리고 또 고민은 문자열을 char로 접근할지 String으로 접근할지 였는데, char는 기본 자료형이니까 스택에 값저장되서 비교가 좋다는 것? String은 equals조심해서 해야한다는 것?..

 

문자열도 금방 익숙해지면 좋겠네요.

 

배운 점

새롭게 익힌 알고리즘, 자료구조, 문법을 작성합니다.

다음에 적용할 점

비슷한 문제를 만났을 때 먼저 확인할 기준을 작성합니다.

```

한 줄 정리

따봉