코딩테스트/프로그래머스

[프로그래머스] [Level 1] [2018 KAKAO BLIND RECRUITMENT] [1차] 다트게임

박소민 2022. 3. 6. 18:04
문제) [1차] 다트게임
 

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

 

programmers.co.kr

 

  • 내 풀이
    • 여러번 실행하면서 계속 코드 변경(시간 오래 걸림)
    • 숫자 10을 인식한 방법: 숫자 1와 0이 연속으로 나오는 경우 값을 0을 10으로 변경
    • 숫자인지 알파벳인지 확인: isdigit() , isalpha()함수 사용
def solution(dartResult):
    n=0 #계산할 점수
    answer=0
    first=0 #바로 전에 얻은 점수
    second=0 #해당 점수
    ten=0 #숫자 10을 인식하기 위한 값(1,0 따로 읽는 것 방지하기 위함)
    count=0
    
    for dr in dartResult:
        count+=1     
        if dr.isdigit():
            if dr=='1':
                ten=1
            elif dr=='0':
                if ten==1:
                    dr=10   
            n=int(dr)
        elif dr.isalpha():
            ten=0 #알파벳이 나오면 숫자 10이 아니므로 
            if dr=='S':
                n**=1
            elif dr=='D':
                n**=2
            elif dr=='T':
                n**=3
            #변경된 n값을 *계산을 위해 저장
            if count==1:
                first=n
            elif count==2:
                second=n
            else:
                first=second
                second=n
            #옵션이 없을 수 있으니 미리 더함
            answer+=n

        if dr=='*':
            #더했던 이전 값과 현재 값을 빼고 2배한 값으로 다시 더함
            answer-=(first+second)
            #first, second가 2배된 값으로 저장되어야 하므로 값 변경 후 더함
            first*=2
            second*=2
            answer+=(first+second)
            
        elif dr=='#':
            #더한 값 취소하고 -1배한 값으로 다시 더함
            answer-=n                
            n*=(-1)
            answer+=n
            #변경된 n값을 *계산을 위해 저장
            if count==1:
                first=n
            elif count==2:
                second=n
            else:
                first=second
                second=n
        
    return answer

 

  • 다른 사람 풀이
    • 숫자 10을 인식한 방법: replace() 함수'10'을 'k'로 치환 후 for문에서 k가 나오면 10으로 출력
    • → 문자열 2개 짜리를 문자열 한 개로 치환
    • 각각의 계산 값들을 리스트에 넣고 sum()으로 전체 합산
    • 📍조건이 될 값이 정해져 있다면 리스트에 넣어서 사용하기
    • → sdt=['S', 'D', 'T']
def solution(dartResult):
    point=[]
    answer=[]
    dartResult=dartResult.replace('10','k')
    point=['10' if i=='k' else i for i in dartResult]
    
    i=-1 #각각의 숫자가 다른 인덱스 위치에 저장되도록 함
    sdt=['S','D','T']
    for j in point:
        if j in sdt:
            answer[i]=answer[i]**(sdt.index(j)+1)
        elif j=='*':
            answer[i]=answer[i]*2
            if i!=0: #첫 번째 값이 아닐 경우에만 이전 값이 존재하므로
                answer[i-1]=answer[i-1]*2
        elif j=='#':
            answer[i]=answer[i]*(-1)
        else: #숫자일 경우
            answer.append(int(j))
            i+=1
            
    return sum(answer)