알고리즘 문제 풀이/프로그래머스

[프로그래머스] 다트 게임- python[ 구현 ]

2024. 3. 19. 16:05
목차
  1. 성능 요약
  2. 구분
  3. 채점결과
  4. 제출 일자
  5. 문제 설명
  6. 다트 게임
  7. 입력 형식
  8. 출력 형식
  9. 입출력 예제
  10. 예전 풀이
  11. 현재 풀이

[level 1] [1차] 다트 게임 - 17682

문제 링크

성능 요약

메모리: 10.4 MB, 시간: 0.04 ms

구분

코딩테스트 연습 > 2018 KAKAO BLIND RECRUITMENT

채점결과

정확성: 100.0
합계: 100.0 / 100.0

제출 일자

2024년 03월 19일 16:01:48

문제 설명

다트 게임

카카오톡에 뜬 네 번째 별! 심심할 땐? 카카오톡 게임별~

Game Star

카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.

  1. 다트 게임은 총 3번의 기회로 구성된다.
  2. 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.
  3. 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.
  4. 옵션으로 스타상(*) , 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.
  5. 스타상(*)은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상(*)의 점수만 2배가 된다. (예제 4번 참고)
  6. 스타상(*)의 효과는 다른 스타상(*)의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다. (예제 4번 참고)
  7. 스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고)
  8. Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.
  9. 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.

0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.

입력 형식

"점수|보너스|[옵션]"으로 이루어진 문자열 3세트.
예) 1S2D*3T

  • 점수는 0에서 10 사이의 정수이다.
  • 보너스는 S, D, T 중 하나이다.
  • 옵선은 *이나 # 중 하나이며, 없을 수도 있다.

출력 형식

3번의 기회에서 얻은 점수 합계에 해당하는 정수값을 출력한다.
예) 37

입출력 예제

예제 dartResult answer 설명
1 1S2D*3T 37 11 * 2 + 22 * 2 + 33
2 1D2S#10S 9 12 + 21 * (-1) + 101
3 1D2S0T 3 12 + 21 + 03
4 1S*2T*3S 23 11 * 2 * 2 + 23 * 2 + 31
5 1D#2S*3S 5 12 * (-1) * 2 + 21 * 2 + 31
6 1T2D3D# -4 13 + 22 + 32 * (-1)
7 1D2S3T* 59 12 + 21 * 2 + 33 * 2

해설 보러가기

예전 풀이

찾아보니 예전에 푼 코드가 있더라 완전 if문으로 푸는 코드인 것 같다.

def solution(dartResult):
    answer,total = [],[]
    area = ['S','D','T']
    bonus = ['*','#']
    temp = ''
    for dart in dartResult:
        if dart in area:
            answer.append([int(temp),dart])
            temp = ''
        elif dart in bonus:
            answer[-1].append(dart)
        else: temp += dart
    for i in range(0,3):
        if answer[i][1] == 'S':
            total.append(answer[i][0])
        elif answer[i][1] == 'D':
            total.append(answer[i][0]**2)
        elif answer[i][1] == 'T':
            total.append(answer[i][0] **3)
    for i in range(0,3):
        if len(answer[i]) == 3:
            if answer[i][2] == "#":
                total[i] = -total[i]
            else:
                if i >0:
                    total[i] *=2
                    total[i-1] *=2
                else: total[i] *=2
    return sum(total)

현재 풀이

초기 목표는 기회별로 자르는 것이었다.
다만 문자열에 구분이 없고, 옵션의 여부도 확실하지 않으며, 10이라는 변수 때문에 포기하였다
우선 숫자 값을 먼저 뽑고, 그 숫자가 있는 인덱스도 저장하여 조건문으로 처리하였다.
풀고보니 오히려 예전 코드보다 길어졌다. 예전 코드가 기회별로 자르는 코드로 훨씬 좋은 코드로 보인다.
예전 코드에 주석 몇개만 달면 더 좋을 것 같다는 생각이 든다. 나는 퇴보한 것인가..


def solution(dartResult):
    #숫자 뽑는 코드
    num_range = [str(num) for num in range(0,11)]
    index = 0
    chances = []
    pointer = -1
    while len(chances)<3:
        pointer +=1
        current = dartResult[pointer]
        if current in num_range:
            if dartResult[pointer:pointer +2] == '10':
                chances.append([10,pointer+2])
                pointer +=1
            else: 
                chances.append([int(dartResult[pointer]),pointer+1])
            index +=1
    # 나머지 문자 받아서 연산 코드
    answer = []
    for chance,i in chances:
        # 제곱 배수
        if dartResult[i] == 'D':
            answer.append(chance**2)
        elif dartResult[i] == 'T':
            answer.append(chance**3)
        else: 
            answer.append(chance)
        #옵션
        i +=1
        if i != len(dartResult):
            if dartResult[i] == '#':
                answer[-1]*=(-1)
            elif dartResult[i] == '*':
                if len(answer) ==1:
                    answer[-1]*=2
                else: 
                    answer[-1] *=2
                    answer[-2] *=2
    return sum(answer)

'알고리즘 문제 풀이 > 프로그래머스' 카테고리의 다른 글

[프로그래머스] 둘만의 암호- python[문자열]  (1) 2024.04.12
[프로그래머스 ] 숫자 짝꿍 - python[ 구현 ]  (1) 2024.04.07
[프로그래머스] 기사단원의 무기- python[ 소수판별 ]  (0) 2024.03.19
[프로그래머스] 이상한 문자 만들기 [구현]  (0) 2024.03.11
[프로그래머스] 과일 장수[문자열]  (0) 2024.03.11
  1. 성능 요약
  2. 구분
  3. 채점결과
  4. 제출 일자
  5. 문제 설명
  6. 다트 게임
  7. 입력 형식
  8. 출력 형식
  9. 입출력 예제
  10. 예전 풀이
  11. 현재 풀이
'알고리즘 문제 풀이/프로그래머스' 카테고리의 다른 글
  • [프로그래머스] 둘만의 암호- python[문자열]
  • [프로그래머스 ] 숫자 짝꿍 - python[ 구현 ]
  • [프로그래머스] 기사단원의 무기- python[ 소수판별 ]
  • [프로그래머스] 이상한 문자 만들기 [구현]
잘잔디
잘잔디
4학년이 되고 취업 준비를 위해 2023-01-01부터 공부한 내용을 정리한 블로그입니다.
잘잔디
MBCS 공부일지
잘잔디
전체
오늘
어제
  • 분류 전체보기 (217)
    • 파이썬 (28)
      • 파이썬 이론 (8)
      • NumPy (3)
      • Pandas (6)
      • 파이썬 시각화 (8)
      • 응용 (2)
    • Java (3)
    • Back (38)
      • DataBase이론 (12)
      • MySQL (2)
      • JSP (8)
      • JSTL (2)
      • Spring (0)
      • Django (8)
      • MongoDB (6)
      • FastAPI (0)
    • Front (8)
      • HTML (3)
      • CSS (2)
      • JS (1)
    • 회고록 (10)
    • 알고리즘 문제 풀이 (95)
      • 알고리즘 이론 공부 (14)
      • 프로그래머스 (69)
      • 백준 (12)
    • 머신러닝 (0)
    • 딥러닝 (0)
    • Git (3)
    • R 프로그래밍 (3)
    • 빅데이터 관리 (16)
      • 리눅스 (4)
      • Hadoop (12)
    • AWS (2)
    • 일상 (10)
      • 책 리뷰 (5)
      • TOEIC (2)
      • 자잘하게 공부한 것들 (2)
    • 사이버보안 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • git
  • 이중우선순위 큐
  • HTML
  • JS
  • Database
  • 백준
  • Java
  • backend
  • CSS
  • 즐거웠다
  • OOP
  • web
  • JavaScript
  • Encore
  • 객체지향
  • db
  • 골드
  • playdata
  • 독산역

최근 댓글

최근 글

hELLO · Designed By 정상우.
잘잔디
[프로그래머스] 다트 게임- python[ 구현 ]
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.