inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

별개의 문제 도움 요청 드립니다 선생님 :)

254

한유태
0

안녕하세요 선생님 🙂 선생님께서 강의로 알려주신 것들과는 별개의 문제인데요, 로직이 떠오르지가 않아서 도움 요청 드립니다!

 

제가 판단했을 때, nums 배열 안에 있는 숫자들을 백트래킹으로 더하고 max함수로 그중에서 가장 큰 숫자를 고르는 문제인거까지 파악했는데요, 백트래킹 조건을 어떻게 줘야할지 도무지 모르겠습니다 ㅠㅠ

 

풀이까지 바라는건 너무 염치가 없을 것 같습니다. 어떤 아이디어로 풀어야 하는지만 알려주신다면 정말 감사하겠습니다..!!

 


축구 구단에서 신입 선수의 등번호를 정할 때 특이한 방식으로 등번호를 정합니다.

선배 선수들이 -100에서 +100까지의 숫자를 적어서 선착순으로 번호를 제출합니다.

그렇게 해서 만들어진 번호 목록 nums = {-1, -3, -2}가 만들어집니다.

 

점수는 합할 점수와 버릴 점수로 구분할 수 있습니다. 점수를 계속 더하다가 버리고 싶은 점수가 있으면 버리면 되는데, 연속해서 버리지 못하는 조건만 충족시키면 됩니다. 그렇게 해서 최대값에 해당하는 등번호를 만들어야 합니다.

 

조건

  1. 숫자의 총 합은 점수 목록에서 더할 수 있는 모든 숫자를 더한 경우의 수 중에서 가장 큰 값

  2. 숫자를 순서대로 더하는데, 더하지 않을(버릴) 숫자는 2회 이상 연속될 수 없다.

  3. 위의 -1, -3, -2에서 아무 것도 버리지 않고 더하면 등번호는 -6이지만, 중간에 -3을 버리면 등번호는 -3으로 정해진다.

  4. nums = {-3, 2, 4, -1, -2, -5}라면, 위의 조건을 이용해서 구할 수 있는 최대 등번호는 4.

-3을 버리고, 2와 4를 더하고, -1을 버리고, -2를 합하고, -5를 버리면 [2 + 4 + (-2)] 등번호를 4로 만들 수 있다.

 

제약 조건

  1. 1<= n <= 1e+5

  2. -100 <= nums[i] <= 100, 0 <= i < n

c++ 코딩-테스트

답변 1

1

큰돌

안녕하세요 유태님 ㅎㅎ

원래는 강의 외의 문제는 해설해드리지 않지만 답변을 드리면요.

 

이 문제는 DP문제입니다. dp[idx][flag]로 놓고 flag는 이번 idx를 제외했냐 안했냐를 설정해서 2회이상을 방지하면 됩니다.

이렇게 해놓고

max(go(idx + 1, 0), go(idx + 1, 1) + num[idx])

이런식으로 구축하시면 됩니다.

 

감사합니다.

코테 관련 질문

0

7

2

코테 준비 방법 문의

0

14

1

공부 시작..

0

10

1

방산 SW 개발자가 되기 위한 조언을 부탁드립니다!

1

98

1

고민이있습니다...!

0

120

1

FPS 서버 충돌 질문드립니다.

0

104

1

백준 서비스 종료

0

285

1

재귀함수 코드를 작성하는 단계가 어렵습니다.

0

225

0

계속 공부해도 되는지 모르겠습니다

0

437

3

진로가 큰 걱정입니다...

0

302

1

강의에 나오는 알고리즘이 코테에 많이 나오는건가요?

0

355

0

구현 유형 추천문제

0

322

1