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

Gyuhan Park·2021년 7월 11일
0

코딩테스트 정복

목록 보기
8/47
post-thumbnail

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

다트게임의 점수계산 로직을 완성해 0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.

# 오류코드

합계: 84.4 / 100.0 : 테스트 4,6,7 실패 / 5,8 런타임에러
0점과 10점을 구분못해서 런타임에러가 존재한다.

def solution(dartResult): # 0점 10점 구분 x
    answer = []
    idx = 0
    for i in dartResult: 
        if i == '0':
            if answer[idx-1] == 1:
                answer[idx-1] = 10
        if i.isdecimal():
            answer.append(int(i))
            idx += 1
        elif i == '*':
            if len(answer) == 1:
                answer[idx-1] = answer[idx-1] *2
            else:
                answer[idx-2] = answer[idx-2]*2
                answer[idx-1] = answer[idx-1]*2
        elif i == '#':
            answer[idx-1] = answer[idx-1]*(-1)
        elif i == 'S':
            answer[idx-1] = answer[idx-1]**1
        elif i == 'D':
            answer[idx-1] = answer[idx-1]**2            
        elif i == 'T':
            answer[idx-1] = answer[idx-1]**3
        
    print(answer)
    result = sum(answer)
    return result

합계: 87.5 / 100.0 : 테스트 4,5,6,7 실패
10점인 경우가 아직 문제를 일으키는 것 같다. 천천히 다시 생각해봐야겠다.

def solution(dartResult):
    answer = []
    idx = 0
    for index, i in enumerate(dartResult): 
        if i == '0':
            if dartResult[index-1].isdecimal():
                answer[idx-1] = 10
        if i.isdecimal():
            answer.append(int(i))
            idx += 1
        elif i == '*':
            if len(answer) == 1:
                answer[idx-1] = answer[idx-1] *2
            else:
                answer[idx-2] = answer[idx-2]*2
                answer[idx-1] = answer[idx-1]*2
        elif i == '#':
            answer[idx-1] = answer[idx-1]*(-1)
        elif i == 'S':
            answer[idx-1] = answer[idx-1]**1
        elif i == 'D':
            answer[idx-1] = answer[idx-1]**2            
        elif i == 'T':
            answer[idx-1] = answer[idx-1]**3
        
    print(answer)
    result = sum(answer)
    return result

# 정답코드

문제점 : 10점이 연속으로 나오는 경우 10만 저장해야되는데 조건식을 잘못세워 10과 0을 저장해 테스트케이스를 통과하지 못했다.

def solution(dartResult):
    answer = []
    idx = 0
    for index, i in enumerate(dartResult): 
                
        if i.isdecimal():
            if i == '0' and dartResult[index-1] == '1':
                    answer[idx-1] = 10
            else:
                answer.append(int(i))
                idx += 1
        elif i == '*':
            if len(answer) == 1:
                answer[idx-1] = answer[idx-1] *2
            else:
                answer[idx-2] = answer[idx-2]*2
                answer[idx-1] = answer[idx-1]*2
        elif i == '#':
            answer[idx-1] = answer[idx-1]*(-1)
        elif i == 'S':
            answer[idx-1] = answer[idx-1]**1
        elif i == 'D':
            answer[idx-1] = answer[idx-1]**2            
        elif i == 'T':
            answer[idx-1] = answer[idx-1]**3
        
    result = sum(answer)
    return result

# 참고코드

import re


def solution(dartResult):
    bonus = {'S' : 1, 'D' : 2, 'T' : 3}
    option = {'' : 1, '*' : 2, '#' : -1}
    p = re.compile('(\d+)([SDT])([*#]?)')
    dart = p.findall(dartResult)
    for i in range(len(dart)):
        if dart[i][2] == '*' and i > 0:
            dart[i-1] *= 2
        dart[i] = int(dart[i][0]) ** bonus[dart[i][1]] * option[dart[i][2]]

    answer = sum(dart)
    return answer

# 정규표현식

특정한 규칙을 가진 문자열의 패턴을 표현하는 데 사용하는 표현식.
ex) 문자열 검색, 날짜, 전화번호 등
re.compile(문자열) : 정규식 패턴을 입력값으로 정규식 객체 return.
compile 함수로 반환된 정규식 객체의 메소드를 이용하여 데이터를 얻어낼 수 있음.

import re
 
text = "제 사무실 전화번호는 031-123-4567 입니다."
 
regex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
matchobj = regex.search(text)
phonenumber = matchobj.group()
print(phonenumber)
method설명
match()문자열의 처음부터 정규식과 대응되는지 확인하여 match 객체 반환
search()문자열 전체를 검색하여 정규식과 매치되는지 확인하여 match 객체 반환
findall()정규식과 매치되는 모든 문자열을 리스트로 반환

정규식 그룹 : group()

정규식 패턴 입력값의 속성이 달라 분리하고 싶을 때 ()로 묶어 분리할 수 있음.
ex) p = re.compile('(\d+)([SDT])([*#]?)')
파라미터로 그룹 번호를 넣어 가져올 수 있고 group() 또는 group(0)으로 전체를 가져올 수 있음.

패턴설명예제
^이걸로 시작^a => area, apple
$이걸로 끝남ma$ => mama, drama
\d0~9\d\d\d => 000, 123
++앞의 패턴이 한번 이상 있어야함\d+ => 숫자가 1개 이상
?앞 패턴이 없거나 하나이어야 함 (Optional 패턴을 정의할 때 사용)[*#]? : *이나 #이 1개 있거나 없음
[문자들]문자들 중에 하나[SDT]
[^문자들]피해야할 문자들의 집합[^abcde] : abcde가 아닌 문자들
profile
단단한 프론트엔드 개발자가 되고 싶은

0개의 댓글