코테 노트/프로그래머스

Level 1 [1차] 다트게임 <KAKAO 2018 BLIND RECRUITMENT> Python3

화요밍 2021. 2. 9. 21:58
728x90
반응형

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

 

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

 

programmers.co.kr

 

최종 코드

 

hwayeon351/Programmers-Algorithms

프로그래머스 코딩테스트 풀이. Contribute to hwayeon351/Programmers-Algorithms development by creating an account on GitHub.

github.com

def cal_score(s, b, op, score):
    s **= b
    if op == "*":
        if len(score) > 0:
            score[-1] *= 2
        score.append(s*2)
    elif op == "#":
        score.append(-s)
    else: score.append(s)
    
def solution(dartResult):
    score = []
    option = ['*','#']
    s = 0
    b = 0
    op = ""
    i = 0
    while i < len(dartResult):
        if dartResult[i].isdigit():
            if i != 0:
                cal_score(s, b, op, score)
                s = 0
                b = 0
                op = ""
            if dartResult[i] == '1':
                if dartResult[i+1] == '0':
                    s = 10
                    i += 1
                else: s = 1
            else: s = int(dartResult[i])
        elif dartResult[i] == 'S':
            b = 1
        elif dartResult[i] == 'D':
            b = 2
        elif dartResult[i] == 'T':
            b = 3
        elif dartResult[i] in option:
            op = dartResult[i]
        if i == len(dartResult)-1:
            cal_score(s, b, op, score)
        i += 1
    return sum(score)

풀이 과정

풀이 시간  37분

def cal_score(s, b, op, score):
    s **= b
    #옵션 '*'인 경우
    if op == "*":
        #이전 점수가 있는 경우
        if len(score) > 0:
            score[-1] *= 2
        score.append(s*2)
    #옵션 '#'인 경우
    elif op == "#":
        score.append(-s)
    #옵션 없는 경우
    else: score.append(s)
    
def solution(dartResult):
    score = []
    option = ['*','#']
    s = 0
    b = 0
    op = ""
    i = 0
    
    while i < len(dartResult):
        #점수인 경우
        if dartResult[i].isdigit():
            #이전 점수 계산
            if i != 0:
                cal_score(s, b, op, score)
                s = 0
                b = 0
                op = ""
            #점수가 1이나 10인 경우
            if dartResult[i] == '1':
                if dartResult[i+1] == '0':
                    s = 10
                    i += 1
                else: s = 1
            #점수가 2~9인 경우
            else: s = int(dartResult[i])
                
        #보너스인 경우
        elif dartResult[i] == 'S':
            b = 1
        elif dartResult[i] == 'D':
            b = 2
        elif dartResult[i] == 'T':
            b = 3

        #옵션인 경우    
        elif dartResult[i] in option:
            op = dartResult[i]
            
        #i가 마지막 인덱스인 경우, 마지막 점수 계산
        if i == len(dartResult)-1:
            cal_score(s, b, op, score)
            
        i += 1
        
    return sum(score)
#시간복잡도 = O(n), 공간복잡도 = O(1)

이전 풀이 1

풀이 시간  29분

 

def solution(dartResult):
    bonus = ['S', 'D' ,'T']
    op = ['*', '#']
    cnt = -1
    arr = []
    for i in range(len(dartResult)):
        if dartResult[i] in bonus:
            if dartResult[i] == 'D':
                arr[cnt] = arr[cnt] ** 2
            elif dartResult[i] == 'T':
                arr[cnt] = arr[cnt] ** 3

        elif dartResult[i] in op:
            if cnt == 0:
                if dartResult[i] == '*':
                    arr[cnt] = arr[cnt] * 2
                if dartResult[i] == '#':
                    arr[cnt] = arr[cnt] * -1
            else:
                if dartResult[i] == '*':
                    arr[cnt] = arr[cnt] * 2
                    arr[cnt-1] = arr[cnt-1] * 2
                elif dartResult[i] == '#':
                    arr[cnt] = arr[cnt] * -1
        else:
            if dartResult[i] == '0':
                if dartResult[i-1].isdigit():
                    arr[cnt] = 10
                    continue
            cnt += 1
            arr.append(int(dartResult[i]))
    return sum(arr)

 이 문제는 KAKAO 2018 BLIND RECRUITMENT [1차] 2번 문제이다. 다른 문제 풀이들도 아래 참고 부분을 확인하면 된다. 앞서, 비밀지도 포스팅에서 말했듯이 예전에 이 문제를 한 번 풀었었다. 하지만 문제가 기억 나지 않아서 비교해보니 이전 코드와 달랐다. 이전 코드도 아래에서 적어 두도록 하겠다.

 

 나는 이 문제를 dartResult의 요소들을 순서대로 탐색하면서 점수, 보너스, 옵션인 경우에 나눠 점수를 업데이트 해주는 루틴으로 풀었다.

1. bonus, op, arr, cnt 선언하기

 앞에서 말했듯이 점수, 보너스, 옵션을 나눠 점수를 업데이트 해줘야 하기 때문에, 보너스 종류가 담긴 리스트 bonus와 옵션의 종류가 담긴 리스트 op를 생성해준다. 문제에서 주어지는 입력은 3번의 게임 결과가 차례대로 적힌 문자열이기 때문에 몇 번째 게임 점수를 업데이트 해야 할 지를 나타내줄 cnt를 -1로 초기화 한다. 마지막으로 리스트 arr는 3개의 게임 점수를 담아 줄 것이다.

    bonus = ['S', 'D' ,'T']
    op = ['*', '#']
    cnt = -1
    arr = []

 

 

2. 다트 게임 점수 계산하기 

 그럼 이제 dartResult에 담긴 문자열을 하나씩 받아오면서 경우에 맞게 점수를 업데이트 해보자.

    for i in range(len(dartResult)):
        if dartResult[i] in bonus:
            if dartResult[i] == 'D':
                arr[cnt] = arr[cnt] ** 2
            elif dartResult[i] == 'T':
                arr[cnt] = arr[cnt] ** 3

        elif dartResult[i] in op:
            if cnt == 0:
                if dartResult[i] == '*':
                    arr[cnt] = arr[cnt] * 2
                if dartResult[i] == '#':
                    arr[cnt] = arr[cnt] * -1
            else:
                if dartResult[i] == '*':
                    arr[cnt] = arr[cnt] * 2
                    arr[cnt-1] = arr[cnt-1] * 2
                elif dartResult[i] == '#':
                    arr[cnt] = arr[cnt] * -1
        else:
            if dartResult[i] == '0':
                if dartResult[i-1].isdigit():
                    arr[cnt] = 10
                    continue
            cnt += 1
            arr.append(int(dartResult[i]))
    return sum(arr)
  • dartResult[i]가 보너스인 경우
    • 'D' 보너스인 경우, arr[cnt] = arr[cnt] ** 2를 하여 해당 게임의 점수를 거듭제곱한 값으로 업데이트 해준다.
    • 'T' 보너스인 경우, arr[cnt] = arr[cnt] ** 2를 하여 해당 게임의 점수를 세 제곱한 값으로 업데이트 해준다.

 

  • dartResult[i]가 옵션인 경우
    • cnt == 0인 경우(첫 번째 게임의 옵션인 경우), 첫 번째 게임의 옵션은 해당 게임에만 옵션이 적용된다.
      • '*' 옵션인 경우, arr[cnt] = arr[cnt] * 2를 하여 첫 번째 게임의 점수를 2배로 업데이트 해준다.
      • '#' 옵션인 경우, arr[cnt] = arr[cnt] * -1을 하여 첫 번째 게임의 점수를 마이너스 점수로 업데이트 해준다.
    • cnt != 0인 경우, 
      • '*' 옵션인 경우, arr[cnt] = arr[cnt] * 2와 arr[cnt-1] = arr[cnt-1] * 2 하여 해당 게임의 점수와 이전 게임의 점수를 2배로 업데이트 해준다.
      • '#' 옵션인 경우, arr[cnt] = arr[cnt] * -1을 하여 해당 게임의 점수를 마이너스 점수로 업데이트 해준다.

 

  • dartResult[i]가 점수인 경우
    • dartResult[i] == '0'인 경우, 
      • dartResult[i-1].isdigit() == True인 경우(이전 문자가 숫자인 경우), 해당 게임 점수가 10점임을 의미한다. 따라서, arr[cnt] = 10 해준다.
      • dartResult[i-1].isdigit() == False인 경우, 해당 게임 점수가 0점임을 의미한다. 조건문 밖으로 나가 cnt += 1과 arr.append(int(dartResult[i])를 해준다.
    • dartResult[i] != '0'인 경우, cnt += 1과 arr.append(int(dartResult[i])를 하여 해당 게임의 점수를 arr[cnt]에 저장한다.

 


이전 풀이 2

def solution(dartResult):
    dartResult=list(dartResult)
    dart=[]
    num = []
    cal = []
    
    for i in range(len(dartResult)):
        if dartResult[i]=='1' and dartResult[i+1]=='0':
            dart.append(10)
        elif dartResult[i]=='0' and dartResult[i-1]=='1':
            continue
        else:
            dart.append(dartResult[i])

    for i in range(len(dart)):
        if dart[i]=='S':
            cal.append(num[len(num)-1])
        elif dart[i]=='D':
            cal.append(num[len(num)-1]**2)
        elif dart[i]=='T':
            cal.append(num[len(num)-1]**3)
        elif dart[i]=='*':
            cal=cal[:-2]+list(map(lambda x:x*2, cal[-2:]))
        elif dart[i]=='#':
            cal[len(cal)-1] = -cal[len(num)-1]
        else:
            num.append(int(dart[i]))

    return sum(cal)

 


참고

 

Level 1 [1차] 비밀지도 Python3

programmers.co.kr/learn/courses/30/lessons/17681?language=python3 코딩테스트 연습 - [1차] 비밀지도 비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비..

hwayomingdlog.tistory.com

 

Level 2 [1차] 캐시

programmers.co.kr/learn/courses/30/lessons/17680?language=python3 코딩테스트 연습 - [1차] 캐시 3 [Jeju, Pangyo, Seoul, NewYork, LA, Jeju, Pangyo, Seoul, NewYork, LA] 50 3 [Jeju, Pangyo, Seoul, Jeju,..

hwayomingdlog.tistory.com

 

Level 3 [1차] 셔틀버스 Python3

https://programmers.co.kr/learn/courses/30/lessons/17678?language=python3 코딩테스트 연습 - [1차] 셔틀버스 10 60 45 ["23:59","23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "..

hwayomingdlog.tistory.com

 

Level 2 [1차] 뉴스 클러스터링

programmers.co.kr/learn/courses/30/lessons/17677?language=python3 코딩테스트 연습 - [1차] 뉴스 클러스터링 뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기..

hwayomingdlog.tistory.com

 

Level 2 [1차] 프랜즈 4블록

programmers.co.kr/learn/courses/30/lessons/17679 코딩테스트 연습 - [1차] 프렌즈4블록 프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제

hwayomingdlog.tistory.com

 

Level 3 [1차] 추석 트래픽 Python3

https://programmers.co.kr/learn/courses/30/lessons/17676?language=python3 코딩테스트 연습 - [1차] 추석 트래픽 입력: [ "2016-09-15 20:59:57.421 0.351s", "2016-09-15 20:59:58.233 1.181s", "2016-09-15..

hwayomingdlog.tistory.com

 

 

 

 

 

728x90
반응형