문제 풀이 구글링없이, 최대한 필요한 재료 학습을 거쳐 나만의 알고리즘 을 뽑아내려다보니 코드가 굉장히 더럽고, 복잡해지고 있다..
이곳에는 그냥 더럽더라도 나만의 풀이를 올리지만, 더 나은 풀이들을 따로 공부해야할 것 같다.
정답률이 낮아서 기대했는데 풀고나니 해결점수 1점 밖에 안줬다 ㅠㅠ
- [1차] 다트 게임
다트 게임
카카오톡에 뜬 네 번째 별! 심심할 땐? 카카오톡 게임별~

카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.
- 다트 게임은 총 3번의 기회로 구성된다.
- 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.
- 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.
- 옵션으로 스타상(*) , 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.
- 스타상(*)은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상(*)의 점수만 2배가 된다. (예제 4번 참고)
- 스타상(*)의 효과는 다른 스타상(*)의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다. (예제 4번 참고)
- 스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고)
- Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.
- 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.
0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.
입력 형식
"점수|보너스|[옵션]"으로 이루어진 문자열 3세트.
예) 1S2D*3T
- 점수는 0에서 10 사이의 정수이다.
- 보너스는 S, D, T 중 하나이다.
- 옵선은 *이나 # 중 하나이며, 없을 수도 있다.
출력 형식
3번의 기회에서 얻은 점수 합계에 해당하는 정수값을 출력한다.
예) 37
입출력 예제
예제dartResultanswer설명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 |
이번에도 긴 볼륨때문에 문제 해석이 약간 버거웠다. 아직 지능개발이 더 필요할 것 같다.
1회 , 2회, 3회차 던지기에 대한 점수와 그에 대한 D,T등의 추가점수, 그리고 # * 등의 보너스 요소로 이루어진 문자열이 주어진다.
여기에서 각 요소들에 대한 점수를 합산에 answer 을 만들어 내면 되는 문제이다.
처음에는 숫자별 인덱스를 뽑아내, 그 인덱스기준으로 슬라이싱해 문자열을 회차별로 끊어내려 했다.
하지만 이 방법은 10이라는 두자리수 점수가 존재하기 때문에 실패 했다.
이후 정규식을 사용해 문제 풀이에 들어 갔으나, 숫자 단위로 커트해내도, 다시 그 문자열들을 커트해내야 하나라는 문제에 봉착했다.
어쨌든 아래는 정리된 내용이다
1.3회차로 나눠서 던지기 때문에 숫자 세개는 고정적으로 등장한다. 하지만 10이 포함되기 때문에 길이는 가변적이다.
2.보너스 요소인 알파뱃 SDT 는 고정으로 등장하나, *#는 가변적으로 등장한다.
3.리스트로 문자열을 분리해 for loop연산을 하려면, 어쨌든 회차에 대해 연산 해야하기 때문에,
분리된 리스트의 길이와 그 회차별 요소들의 인덱스가 동일해야한다
풀이.
1.*# 은 가변적이기 때문에 따로 각자 리스트로 반환받을 수는 없고,
2.숫자 리스트 하나, 그리고 알파벳하나와 *#를 포함한 리스트 두가지로 반환 받아 포문으로 처리하기로 한다.
3.문제를 보면 시간적 순서에 따라 진행되지만 우리는 전체결과를 리턴으로 받고, 또 *의 제한 조건이 본회차와 이전 회차에 대해서만 적용이기 때문에 DT에 대한 연산과 *#에 대한 연산을 따로 하기로 한다.
1. 숫자 리스트 하나, 그리고 알파벳하나와 *#를 포함한 리스트 두가지로 반환 받아 포문으로 처리하기로 한다.
pattern 객체 p 에는 정규식 \d+를 넣어 매치객체 m에서 숫자리스트를 만들도록 컴파일 했고
pattern 객체 p2 에는 정규식 '[A-Z]+\W*를 넣어 매치객체 m2에서 문자+특수문자 열 리스트를 만들도록 컴파일 했다.
2.문제를 보면 시간적 순서에 따라 진행되지만 우리는 전체결과를 리턴으로 받고, 또 *의 제한 조건이 본회차와 이전 회차에 대해서만 적용이기 때문에 DT에 대한 연산과 *#에 대한 연산을 따로 하기로 한다.
매치객체 m을 score 변수에 정수화시켜 리스트로 선언했다.
인덱스 연산이기 때문에 for i in range(3)으로 증감하는 변수 i를 이용할 수있도록 했다.
먼저 D,T 를 검사해 거듭제곱을 계산하고,
이후 *#을 검사해 조건에 맞도록 점수를 수정하게 했다.
인덱스를 활용한 연산이기 때문에 i 가 0일때 변수 i-1에서 내가 계획한 값과 전혀 다른 값이 생길 수 있기 때문에
i가 0일때와 0이 아닐때를 구분하도록 조건식을 작성했다.
좀더 명쾌하고 간단한 풀이를 생각해 봐야겠다
'파이썬 알고리즘 문제풀이 > 정규식' 카테고리의 다른 글
프로그래머스 LV0 - 옹알이(1) python (0) | 2022.11.13 |
---|---|
프로그래머스 lv2 - 최댓값과 최솟값 (1) | 2022.11.06 |
프로그래머스 lv 0 - 숨어있는숫자의 덧셈 (0) | 2022.11.01 |
댓글