ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 도둑질
    코딩 테스트/Level 4 2020. 10. 20. 10:26
    반응형

    https://programmers.co.kr/learn/courses/30/lessons/42897

     

    코딩테스트 연습 - 도둑질

    도둑이 어느 마을을 털 계획을 하고 있습니다. 이 마을의 모든 집들은 아래 그림과 같이 동그랗게 배치되어 있습니다. 각 집들은 서로 인접한 집들과 방범장치가 연결되어 있기 때문에 인접한 ��

    programmers.co.kr

    재귀로는 정확도 테스트에서도 시간 초과가 됩니다. 

    정확도 점수 부스러기 좀 먹어보겠다는데...
    인심 참 야박하네요. 
    강호의 정이... 
    언제부터 전산계가...

    def solution(money):
        max_total = [0]
        for i in range(3):
            find(money[:], i, 0, max_total)
        return max_total[0]
    
    
    def find(money, pos, total, max_total):
        total += money[pos]
        money[pos - 1] = money[pos] = money[(pos + 1) % len(money)] = 0
        if sum(money) == 0:
            max_total[0] = max(max_total[0], total)
            return
        for i in range(len(money)):
            if money[i] != 0:
                find(money[:], i, total, max_total)
    

     조금 더 깔끔하게 정리.

    def solution(money):
        return max(find(money[:], 0, 0), find(money[:], 1, 0), find(money[:], 2, 0))
    
    
    def find(money, pos, total):
        max_total = 0
        total += money[pos]
        money[pos - 1] = money[pos] = money[(pos + 1) % len(money)] = 0
        for i in range(len(money)):
            if sum(money) == 0:
                max_total = max(max_total, total)
            elif money[i] != 0:
                max_total = find(money[:], i, total)
        return max_total

    동적계획법을 써야겠네요. 

    def solution(money):
        answer = 0
        for first in range(2): ##
            dp = [0] * len(money)
            dp[first] = money[first]
            dp[first + 1] = max(dp[first], money[first + 1])
            for i in range(2, len(money) - 1):
                dp[first + i] = max(dp[first + i - 1], money[first + i] + dp[first + i - 2])
            answer = max(answer, *dp)
        return answer
    
    
    ## 0으로 시작, 1로 시작. 총 2회.
    효율성  테스트
    테스트 1 〉	통과 (777.31ms, 696MB)
    테스트 2 〉	통과 (679.84ms, 651MB)
    테스트 3 〉	통과 (699.98ms, 678MB)
    테스트 4 〉	통과 (771.51ms, 686MB)
    테스트 5 〉	통과 (632.80ms, 569MB)
    테스트 6 〉	통과 (701.38ms, 657MB)
    테스트 7 〉	통과 (400.02ms, 387MB)
    테스트 8 〉	통과 (433.91ms, 399MB)
    테스트 9 〉	통과 (513.12ms, 467MB)
    테스트 10 〉	통과 (692.43ms, 664MB)

    슬라이딩 윈도

    def solution(money):
        answer = 0
        for first in range(2):
            dp = [0] * 3
            dp[first] = money[first]
            dp[first + 1] = max(dp[first], money[first + 1])
            for i in range(2, len(money) - 1):
                dp[(first + i) % 3] = max(dp[(first + i - 1) % 3], money[first + i] + dp[(first + i - 2) % 3])
            answer = max(answer, *dp)
        return answer
    효율성  테스트
    테스트 1 〉	통과 (797.22ms, 696MB)
    테스트 2 〉	통과 (752.59ms, 651MB)
    테스트 3 〉	통과 (798.82ms, 678MB)
    테스트 4 〉	통과 (786.50ms, 686MB)
    테스트 5 〉	통과 (615.53ms, 569MB)
    테스트 6 〉	통과 (756.02ms, 657MB)
    테스트 7 〉	통과 (439.54ms, 387MB)
    테스트 8 〉	통과 (453.64ms, 399MB)
    테스트 9 〉	통과 (499.01ms, 467MB)
    테스트 10 〉	통과 (757.13ms, 664MB)

    반복 줄여보기..

    def solution(money):
        dp1 = [0] * len(money)
        dp1[0] = money[0]
        dp1[1] = max(dp1[0], money[1])
    
        dp2 = [0] * len(money)
        dp2[0] = money[1]
        dp2[1] = max(dp2[0], money[2])
    
        for i in range(2, len(money) - 1):
            dp1[i] = max(dp1[i - 1], money[i] + dp1[i - 2])
            dp2[i] = max(dp2[i - 1], money[i + 1] + dp2[i - 2])
        return max(*dp1, *dp2)
    효율성  테스트
    테스트 1 〉	통과 (656.61ms, 696MB)
    테스트 2 〉	통과 (610.07ms, 651MB)
    테스트 3 〉	통과 (637.11ms, 678MB)
    테스트 4 〉	통과 (603.72ms, 686MB)
    테스트 5 〉	통과 (532.63ms, 569MB)
    테스트 6 〉	통과 (615.01ms, 657MB)
    테스트 7 〉	통과 (341.80ms, 387MB)
    테스트 8 〉	통과 (364.22ms, 399MB)
    테스트 9 〉	통과 (400.91ms, 467MB)
    테스트 10 〉	통과 (588.02ms, 664MB)

    슬라이딩 윈도

    def solution(money):
        dp1 = [money[0], max(money[0], money[1]), 0]
        dp2 = [money[1], max(money[1], money[2]), 0]
        for i in range(2, len(money) - 1):
            dp1[i % 3] = max(dp1[(i - 1) % 3], money[i] + dp1[(i - 2) % 3])
            dp2[i % 3] = max(dp2[(i - 1) % 3], money[i + 1] + dp2[(i - 2) % 3])
        return max(*dp1, *dp2)
    효율성  테스트
    테스트 1 〉	통과 (668.60ms, 696MB)
    테스트 2 〉	통과 (627.06ms, 651MB)
    테스트 3 〉	통과 (639.91ms, 678MB)
    테스트 4 〉	통과 (660.33ms, 686MB)
    테스트 5 〉	통과 (552.67ms, 569MB)
    테스트 6 〉	통과 (593.55ms, 657MB)
    테스트 7 〉	통과 (370.84ms, 387MB)
    테스트 8 〉	통과 (366.58ms, 399MB)
    테스트 9 〉	통과 (422.94ms, 467MB)
    테스트 10 〉	통과 (644.72ms, 664MB)

     

    반응형
Designed by Tistory.