728x90
반응형
programmers.co.kr/learn/courses/30/lessons/17682
최종 코드
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을 하여 해당 게임의 점수를 마이너스 점수로 업데이트 해준다.
- cnt == 0인 경우(첫 번째 게임의 옵션인 경우), 첫 번째 게임의 옵션은 해당 게임에만 옵션이 적용된다.
- 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]에 저장한다.
- dartResult[i] == '0'인 경우,
이전 풀이 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)
참고
728x90
반응형
'코테 노트 > 프로그래머스' 카테고리의 다른 글
Level 2 [1차] 뉴스 클러스터링 <KAKAO 2018 BLIND RECRUITMENT> (0) | 2021.02.09 |
---|---|
Level 2 [1차] 캐시 <KAKAO 2018 BLIND RECRUITMENT> (0) | 2021.02.09 |
Level 1 [1차] 비밀지도 <KAKAO 2018 BLIND RECRUITMENT> Python3 (0) | 2021.02.09 |
Level 2 폰켓몬 Python3 (0) | 2021.02.05 |
Level 2 땅따먹기 Python3 (0) | 2021.02.05 |