티스토리 뷰

반응형

 

 문제

 

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

 

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

 

programmers.co.kr

 

 

 

 

 

 

 문제 상황

 

- 3번의 다트 게임을 시행하는데 총 점수를 계산한다. 점수 계산법은 S,D,T와 #, * 를 활용한다.

 

 

 

 

 

 

 해결 전략

 

- 정규 표현식을 사용하면 편할 수 있을 것 같지만 문제의 난이도가 낮아 단순한 문자열 탐색으로 가능하다. 문자열을 순회하며 게임 하나의 케이스로 판별하는 조건을 정의하여 게임의 점수를 계산해 나간다.

 

 

 

 

 

 

 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def get_score(dart:str-> int:
    if dart[-1== "D":
        return int(dart[:-1])**2
    elif dart[-1== "T":
        return int(dart[:-1])**3
    return int(dart[:-1])
def solution(dartResult:str-> int:
    game = ""
    total_score = 0
    this_game_score = 0
    formal_game_score = 0
    for dart in dartResult:
        if dart.isdigit():
            game += dart
        elif dart.isalpha():
            game += dart
            total_score += get_score(game)
            formal_game_score = this_game_score
            this_game_score = get_score(game)
            game = ""
        elif dart == "#":
            this_game_score *= -1
            total_score += 2*this_game_score
        elif dart == "*":
            total_score += (this_game_score + formal_game_score)
            this_game_score *= 2
            formal_game_score *= 2
    return total_score
cs

 

 

 

 

 

 

 

 

 해설

 

- 한 게임당 점수를 계산하는 함수와 메인 함수로 구별하였다. 문제의 조건을 엄밀하게 세분화하여 계산한다. 

 

 

 

 

 

 

 

 새로 학습한 것 & 실수 

 

- *의 조건에서 thisgame과 formalgame의 점수를 갱신해 주는 것을 하지않아 문제가 발생했었다. 문제의 조건을 세분화 하는 것에서 어려움을 겪었다.

 

- for문으로 전체 순회를 하며 일부분을 저장하는 것은 결국 갱신 시점을 정하는 것인데 while문과 고민하며 시간을 낭비하였다. 기준을 i+1이 숫자인 것으로 잡으면 마지막 경우에 문제가 생기므로 i번째에 문자열인 것을 확인하고, *와 #의 케이스만 추가로 처리하는 것으로 했다.

 

- 메모리와 속도에 너무 집착하지 말자. 자꾸 효율성만 찾다보니 아예 문제 해결 자체가 진행이 되지 않는 경향이 있다.

 

 

 

 

 

 

 

 

반응형
댓글