qmamsm123   3년 전

각 계단까지의 최대 점수합를 저장하는 배열 scores,

각 계단까지의 점수합이 최대일 때 마지막 계단이 연속으로 밟은 계단인지를 나타내는 배열 rapid,

    * rapid[n]이 true면, n번째 계단과 n - 1번째 계단을 밟아 최대 누적합 scores[n]이 도출됐음을 의미합니다.

각 계단의 점수를 저장하는 배열 stairs가 선언돼 있습니다.

 

n>3에 대해 점화식은 다음과 같습니다.

scores[n] = max(scores[n - 2], scores[n - 1]) + stairs[n]

단, rapid[n] == true이면 scores[n] = scores[n-2] + stairs[n]

n번째 계단까지의 최대 누적합은 n - 2번째와 n - 1번째 계단의 최대 누적합 중 최대인 값에 n번째 계단의 점수를 합한 값입니다.

단, n - 1번째 계단의 최대 누적합이 마지막 계단을 연달아 밟아 도출됐다면 n - 2번째 계단의 최대 누적합에 n번째 계단의 점수를 더합니다.

scores[n - 1] == scores[n - 2]인 경우 scores[n - 2]를 선택하여 이후 선택의 여지를 넓혀줍니다.

 

1 ≤ n ≤ 3인 경우엔 다음과 같이 정의합니다.

n = 1일 때, scores[n] = stairs[n]입니다.

n = 2일 때, scores[n] = stairs[n - 1] + stairs[n]입니다.

이 경우 rapid[n] = true가 됩니다.

n = 3일 때, scores[n] = max(scores[n - 1], scores[n - 2]) + stairs[n]입니다.

만약 scores[n - 1]이 선택된 경우 rapid[n] = true가 됩니다.

 

위와 같이 설계한 내용을 코드로 옮긴 뒤, 제출을 했을 때 틀렸다고 나옵니다.

예제는 물론, 질문 답변 게시판의 다양한 반례를 입력했을 때 옳은 결과를 출력합니다.

위 풀이과정에서 놓친 부분이나 잘못 생각하고 있는 부분이 있을까요?

몇 시간 동안 고민해봤지만 무엇이 잘못 됐는지 잘 모르겠습니다.

playsworld16   3년 전

반례 드립니다.

input:

4

1

2

3

4

output: 7

answer: 8

qmamsm123   3년 전

반례 감사합니다. 덕분에 통과됐습니다. 😀

 

기존 코드에서 반례를 입력했을 때, 네 번째 계단에서 rapid[2] == true이므로 scores[3] = scores[1] + stairs[3]이 강제 됐습니다.

하지만 stairs = {1, 2, 3, 4}에서 stairs[0] + stairs[2]가 stairs[0] + stairs[1]보다 큽니다.

즉, scores[n - 3] + stairs[n - 1] > scores[2] 일 수도 있습니다.

기존에서 비교대상이 하나 늘어난 것입니다.

따라서 scores[n]은 다음 중 최대값입니다.

ⅰ. scores[n - 3] + stairs[n - 1] + stairs[n]

ⅱ. scores[n - 2] + stairs[n]

ⅲ. scores[n - 1] + stairs[n] (단, rapid[n - 1] == false)

rapid[n - 1] == false일 때, scores[n]은 ⅰ, ⅱ 중 최대값입니다.

그런데 rapid[n - 1] == true면, scores[n - 1] = scores[n - 3] + stairs[n - 1]입니다.

이는 ⅰ에서와 같은 경우 이므로, 굳이 비교하지 않아도 됩니다.

따라서 n>3 일 때, scores[n]은 ⅰ식과 ⅱ식만을 비교하면 되며, rapid 배열은 더 이상 필요하지 않습니다.

 

이러한 내용을 반영하여 통과된 코드는 아래와 같습니다.

댓글을 작성하려면 로그인해야 합니다.