본문 바로가기
코딩 테스트/프로그래머스

[2020 카카오 인턴십] 스티커 모으기(2)

by 위그든씨 2023. 4. 7.

문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/12971

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 풀이

  • 1칸 띄워서 계산하는 문제이므로 개수가 3개 이하라면 그 수들 중 가장 큰 수가 정답이 됨.
    • a, b, c 일 땐 a와 c도 합체가 안되므로 
  • dp [n]=max(s [n]+dp [n-2], dp [n], s [n]+dp [n-3] ) 
  • 경우의 수
    1. 첫 번째 수부터 계산(이 경우 마지막 숫자는 빼줘야 함)
    2. 두 번째 수부터 계산(이 경우 마지막 숫자도 더하기 가능)
    3. 세 번째 수부터 계산(이 경우 마지막 숫자도 더하기 가능) -> 굳이 따로 계산할 필요 없이 1번의 경우의 수에서 마지막 수까지 다 더한 후 첫 번째 수를 빼면 됨 

소스코드

from collections import deque

dx = [2,3]
def solution(s):
    answer = 0
    n = len(s)
    if(n<=3):
        return max(s)
    dp = [[0]*n for i in range(2)]
    dp[0][0]=s[0]
    dp[1][1]=s[1]
    for j in range(2):
        for i in range(2,n):
            for k in range(2):
                num = i-dx[k]
                if(num<0):
                    continue
                dp[j][i]=max(dp[j][num]+s[i],dp[j][i])
    dp[0][-1]-=s[0]
    answer = max(max(dp[1]),max(dp[0]))
    return answer


print(solution([14, 6, 5, 11, 3, 9, 2, 10]))

 

'코딩 테스트 > 프로그래머스' 카테고리의 다른 글

[그리드] 섬 연결하기 (python)  (1) 2023.04.11
[그래프] 가장 먼 노드  (0) 2023.04.10
[2019카카오] 불량 사용자  (0) 2023.04.07
[해시] 베스트 앨범  (0) 2023.04.06
[연습 문제] 숫자 게임  (0) 2023.04.05