[프로그래머스/python] 코딩테스트 연습 Lv.1 (6월 첫 번째 주)
[1차] 다트게임
문제 설명
0~10까지의 점수가 있는 다트
S(Single) : 점수 1제곱
D(Double) : 점수 2제곱
T(Triple) : 점수 3제곱
*(스타상) : 해당 점수*2 & 바로 전 점수*2
#(아차상) : 해당 점수 마이너스
입출력 예
Solution
def solution(dartResult):
answer = []
dartResult = dartResult.replace('10', 'A') #10 -> A
arr = list(dartResult)
for i in range(len(arr)):
if arr[i]=="S":
num = (10 if arr[i-1] == 'A' else int(arr[i-1]))
answer.append(pow(num, 1))
elif arr[i]=="D":
num = (10 if arr[i-1] == 'A' else int(arr[i-1]))
answer.append(pow(num, 2))
elif arr[i]=="T":
num = (10 if arr[i-1] == 'A' else int(arr[i-1]))
answer.append(pow(num, 3))
elif arr[i]=="*":
answer[len(answer)-1]*=2
if len(answer)-2>=0: #바로 전 점수가 없는 경우(첫번째 점수) 고려
answer[len(answer)-2]*=2
elif arr[i]=="#":
answer[len(answer)-1]*=(-1)
print(answer)
return sum(answer)
처음에는 dartResult를 list로 바꾸고, for문을 이용하여 1과 0이 연속해서 나오면, 둘을 10으로 바꿔주도록 하였다.
하지만 그 for문 때문에 채점 시 런타임 에러가 발생하였다.
따라서 list를 하기 전에 replace함수를 통해 10을 A로 바꾸고, list함수 적용하였다.
ex) list("1D2S#10S") = ["1", "D", "2", "S", "#", "1", "0", "S"] -> X!
ex) list("1D2S#AS") = ["1", "D", "2", "S", "#", "A", "S"]
for문 안에서 S, D, T, *, #을 탐색하면 리스트 바로 앞의 인덱스에 있는 숫자 값에 보너스 혹은 마이너스를 적용하게 되는데, 이때 A가 나오면 10으로 바꿔서 적용하도록 하였다.
Result
소수 찾기
문제 설명
입출력 예
Solution
def solution(n):
answer = 2
if n==2: #2 이하의 소수는 2, 1개 뿐
return 1
if n==3: #3 이하의 소수는 2, 3, 2개 뿐
return 2
for j in range(4, n+1): #n이 4 이상일 때
count = 0#소수이면 0, 합성수(약수가 1개라도 있을 때)이면 1이 됨
for i in range(2, int(j**(1/2))+1):#2부터 j의 제곱근까지 탐색
if j%i==0:#합성수 판별
count = 1
break
if count==0:#소수 판별
answer += 1
return answer
n이 소수인지 아닌지 판별하는 문제
기존)
2부터 n-1까지의 수 중에서 n과 나누었을 때 나머지가 0이면 그 수가 n의 약수이므로 n은 소수가 아니다.
n-1까지 탐색이 끝날 때까지 나머지가 0인 수가 안나오면 소수이다.
-> n의 크기 조건이 커지면서 런타임 에러 발생
새로운 방법)
2부터 n의 제곱근까지의 수 중에서 n과 나누었을 때 나머지가 0이면 그 수가 n의 약수이므로 n은 소수가 아니다.
n의 제곱근까지 탐색이 끝날 때까지 나머지가 0인 수가 안나오면 소수이다.
이유:
ex) n=100, n의 약수: 1, 2, 4, 5, 10, 20, 25, 50, 100
약수에서 굳이 짝꿍을 매겨보자면, (1, 100), (2, 50), (4, 25), (5, 20), (10, 10)이다. 두 수를 곱하면 n이 된다.
즉, 1, 2, 4, 5, 10이 나오지 않으면, 나머지 100, 50, 25, 20이 100의 약수가 되지 않는다.
따라서 n의 제곱근인 10까지만 탐색하여 약수가 있는지 판별해도 충분히 소수인지 합성수인지 알 수 있다.
+ 약수의 개수를 묻는 문제에서는 똑같이 10까지 탐색하되, 탐색한 값이 약수이면서 제곱근(10)이면 1을 count하고, 탐색한 값이 제곱근이 아닌 약수(1, 2, 4, 5)이면 짝꿍까지 포함해서 2를 count한다.