안녕하세요 선생님 🙂 선생님께서 강의로 알려주신 것들과는 별개의 문제인데요, 로직이 떠오르지가 않아서 도움 요청 드립니다!
제가 판단했을 때, nums 배열 안에 있는 숫자들을 백트래킹으로 더하고 max함수로 그중에서 가장 큰 숫자를 고르는 문제인거까지 파악했는데요, 백트래킹 조건을 어떻게 줘야할지 도무지 모르겠습니다 ㅠㅠ
풀이까지 바라는건 너무 염치가 없을 것 같습니다. 어떤 아이디어로 풀어야 하는지만 알려주신다면 정말 감사하겠습니다..!!
축구 구단에서 신입 선수의 등번호를 정할 때 특이한 방식으로 등번호를 정합니다.
선배 선수들이 -100에서 +100까지의 숫자를 적어서 선착순으로 번호를 제출합니다.
그렇게 해서 만들어진 번호 목록 nums = {-1, -3, -2}가 만들어집니다.
점수는 합할 점수와 버릴 점수로 구분할 수 있습니다. 점수를 계속 더하다가 버리고 싶은 점수가 있으면 버리면 되는데, 연속해서 버리지 못하는 조건만 충족시키면 됩니다. 그렇게 해서 최대값에 해당하는 등번호를 만들어야 합니다.
조건
숫자의 총 합은 점수 목록에서 더할 수 있는 모든 숫자를 더한 경우의 수 중에서 가장 큰 값
숫자를 순서대로 더하는데, 더하지 않을(버릴) 숫자는 2회 이상 연속될 수 없다.
위의 -1, -3, -2에서 아무 것도 버리지 않고 더하면 등번호는 -6이지만, 중간에 -3을 버리면 등번호는 -3으로 정해진다.
nums = {-3, 2, 4, -1, -2, -5}라면, 위의 조건을 이용해서 구할 수 있는 최대 등번호는 4.
-3을 버리고, 2와 4를 더하고, -1을 버리고, -2를 합하고, -5를 버리면 [2 + 4 + (-2)] 등번호를 4로 만들 수 있다.
제약 조건
1<= n <= 1e+5
-100 <= nums[i] <= 100, 0 <= i < n
안녕하세요 유태님 ㅎㅎ
원래는 강의 외의 문제는 해설해드리지 않지만 답변을 드리면요.
이 문제는 DP문제입니다. dp[idx][flag]로 놓고 flag는 이번 idx를 제외했냐 안했냐를 설정해서 2회이상을 방지하면 됩니다.
이렇게 해놓고
max(go(idx + 1, 0), go(idx + 1, 1) + num[idx])
이런식으로 구축하시면 됩니다.
감사합니다.
답글