[구현] PRG 17682: [1차]다트 게임

KimRiun·2021년 11월 19일
0

사용 언어: python 3.9.5

❓ Problem

문제 설명

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

난이도

level 1

🚩 Solution

시도 01)

1. 접근법

  1. S, D, T를 먼저 처리한 리스트 answer를 만든다.

    예시) dartResult = "1D#2S*3S" 라면 answer = [1, '#', 2, '*', 3]

  2. 스타상, 아차상을 처리한다.

    answer를 거꾸로 읽으면서 '*' 혹은 '#'을 처리한다.

    1. 스타상일 경우
      1. while문을 통해 앞에서 등장한 숫자 2개를 찾는다.
      2. 찾는 도중 기호가 발견되면 해당 위치를 기억해둔다.
      3. 숫자 2개를 2배씩 만든다.
      4. 기호가 발견된 위치 or 기호가 발견되지 않았다면 (현재위치 -3) 위치로 이동한다.
    2. 아차상일 경우
      1. 직전 숫자에 -1을 곱한다.
      2. (현재위치 -2) 위치로 이동한다.
    3. 기호에 영향을 받지 않는 숫자는 건드리지 않는다.
  3. '*'와 '#'을 제외한 수들을 합하고 반환한다.

2. 코드

def solution(dartResult):
    # S, D, T 처리하기
    # i: 현재위치, j: 점수가 시작되는 인덱스
    i = 0
    j = 0
    answer = []
    while(i<len(dartResult)):
        if dartResult[i] == '*':
            answer.append('*')
            j = i+1
        elif dartResult[i] == '#':
            answer.append('#')
            j = i+1
        else:
            if dartResult[i] == 'S':
                answer.append(int(dartResult[j:i]))
                j = i+1
            elif dartResult[i] == 'D':
                answer.append(int(dartResult[j:i])**2)
                j = i+1
            elif dartResult[i] == 'T':
                answer.append(int(dartResult[j:i])**3)
                j = i+1
            
        i += 1

    # 스타상, 아차상 처리
    # answer를 거꾸로 읽어가며 *와 #을 찾아 계산한다
    # i: 현재위치, j: 다음으로 이동할 위치(스타상 로직에서 필요한 변수)
    i = len(answer) - 1
    j = len(answer) - 1
    while(i >= 0):
        # 스타상일 때
        if answer[i] == '*':
            cnt = 0 # 처리된 숫자 수
            j = i - 3 # 2개의 숫자 처리 후 이동할 위치
            i -= 1
            while (i >= 0 and cnt < 2):
                # 만약 기호 '*' 또는 '#'이 발견되면, 2개 숫자 처리후 기호 위치로 이동한다
                if answer[i] == '*' or answer[i] == '#':
                    j = i
                else :
                    # 앞에 2개 숫자에 2를 곱한다
                    answer[i] = answer[i]*2
                    cnt += 1
                i -= 1
            i = j
        # 아차상일 때
        elif answer[i] == '#':
            # 직전 숫자에 -1을 곱한다  
            answer[i-1]= -answer[i-1]
            i -= 2  
        else :
            i -= 1

    # '*'와 '#'을 제외한 수들을 합한다
    answer = [item for item in answer if item != '*' and item != '#']
    return sum(answer)

3. 시간복잡도

O(n)O(n)

4. 결과

성공

5. 소요 시간

1시간 이상

📕 피드백

1. 검색한 내용

  1. 리스트 특정 원소 제거하기
  • ex) '*'와 '#'이 아닌 원소들만 저장하기
answer = [item for item in answer if item != '*' and item != '#']

2. 실수

3. 발전 방향 (개선/추가사항)

4. 다른 사람 풀이

풀이1)

  • 링크

  • 접근법

  • 코드

  • 배울 점
profile
Java, Python

0개의 댓글