<문제>
N개의 스티커가 원형으로 연결되어 있습니다. 다음 그림은 N = 8인 경우의 예시입니다.
원형으로 연결된 스티커에서 몇 장의 스티커를 뜯어내어 뜯어낸 스티커에 적힌 숫자의 합이 최대가 되도록 하고 싶습니다. 단 스티커 한 장을 뜯어내면 양쪽으로 인접해있는 스티커는 찢어져서 사용할 수 없게 됩니다.
예를 들어 위 그림에서 14가 적힌 스티커를 뜯으면 인접해있는 10, 6이 적힌 스티커는 사용할 수 없습니다. 스티커에 적힌 숫자가 배열 형태로 주어질 때, 스티커를 뜯어내어 얻을 수 있는 숫자의 합의 최댓값을 return 하는 solution 함수를 완성해 주세요. 원형의 스티커 모양을 위해 배열의 첫 번째 원소와 마지막 원소가 서로 연결되어 있다고 간주합니다.
제한 사항
- sticker는 원형으로 연결된 스티커의 각 칸에 적힌 숫자가 순서대로 들어있는 배열로, 길이(N)는 1 이상 100,000 이하입니다.
- sticker의 각 원소는 스티커의 각 칸에 적힌 숫자이며, 각 칸에 적힌 숫자는 1 이상 100 이하의 자연수입니다.
- 원형의 스티커 모양을 위해 sticker 배열의 첫 번째 원소와 마지막 원소가 서로 연결되어있다고 간주합니다.
<해설>
이 문제는 다른 기업 기출 문제에 비해 굉장히 쉬운 문제였습니다. 첫번째와 마지막 부분의 처리를 생각해주고 다이나믹 프로그래밍 기법을 사용하면 풀리는 문제입니다. 첫번째 칸을 고르는 dp와 마지막 칸을 고르는 dp로 나누어 처리해주면 됩니다.
class Solution {
public int solution(int sticker[]) {
if(sticker.length == 1) return sticker[0];
else if(sticker.length == 2) return Math.max(sticker[0], sticker[1]);
int answer = 0;
int[][] dp1, dp2;
dp1 = new int[2][sticker.length-1];
dp2 = new int[2][sticker.length-1];
dp1[0][0] = sticker[0];
dp2[0][0] = sticker[1];
for(int i=1; i<sticker.length-1; i++){
dp1[0][i] = dp1[1][i-1]+sticker[i];
dp1[1][i] = Math.max(dp1[0][i-1], dp1[1][i-1]);
dp2[0][i] = dp2[1][i-1]+sticker[i+1];
dp2[1][i] = Math.max(dp2[0][i-1], dp2[1][i-1]);
answer = Math.max(answer, Math.max(dp1[0][i] ,Math.max(dp1[1][i], Math.max(dp2[0][i], dp2[1][i]))));
}
return answer;
}
}
<링크>
반응형
'프로그래머스 > Level3' 카테고리의 다른 글
[프로그래머스][Java] 네트워크 (0) | 2022.03.01 |
---|---|
[프로그래머스][Java] 단속카메라 (0) | 2022.02.28 |
[프로그래머스][Java] 베스트앨범 (0) | 2022.02.24 |
프로그래머스 / level3 / 표 편집 / 2021 카카오 채용연계형 인턴쉽 (0) | 2021.11.06 |
프로그래머스/Level3/셔틀버스/2018 카카오 블라인드 1차 (0) | 2021.11.02 |
댓글