Python/코딩테스트

[프로그래머스/python] 코딩테스트 연습 Lv.1 (6월 첫 번째 주)

김과분 2023. 6. 6. 18:00
728x90

[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한다.

 

Result

728x90