당니의 개발자 스토리

1-H 본문

내 풀이(http://boj.kr/9bb115b9d6544242a4fa51841fd3fa22) - 맞음

 

공유 소스 보기

 

www.acmicpc.net


1-H

자 1-H 백준 2559 수열 문제를 풀어 보도록 할게요.

자 N은 1에서 10만이고 K는 1에서 10만이니까 10만 - 1이죠. 왜냐면 N 사이값이라고 했으니까요.

사이값 이라는 거는 그 범위를 뺀다라고 하는 거거든요.

그래서 이 문제는 연속된 온도의 합이 연속된 온도의 합이 최대가 되는 값을 구하라라는 건데, 여러분 어떤 생각이 나요?

바로 구간합이 생각이 나야 돼요.

문제에서 중요했던 점은 뭐냐면, 사실은 이 문제의 최소값을 정하는게 중요해요.

문제에서 최대값을 구하라라고 하면은 최소값에서부터 최대값을 구하는 거에요.

만약 문제에서 최소값을 구하라 라고 하면은 최대값에서부터 최소값을 구하라 라는게 되는 거에요.

저희가 최대값을 구할 때 어떤 로직을 쓰죠?

ret = max(ret, value); 이런 식으로 하죠. 그러니까 즉, ret에다가 최대값을 계속해서 갱신해나가면서 ret을 만들고 그걸 기반으로 최종적인 최대값을 만들어서 문제에다가 반환을 하는거죠.

자 그러면은 최소값은 어떻게 할까요?

마찬가지로 ret에다가 계속해서 최소값을 쌓아가면서, 계속 갱신해나가면서 최소값을 만드는 거죠.

이제 최소값부터 해야 되는 건 알겠어요. 그럼 최소값을 뭘로 설정해야 될까요?

그건 바로 이 문제의 최소값을 결정하는 거예요.

자 이 문제를 최악으로 한번 가정을 해보죠.

이 문제가 -100자리가 10만 번 나온다고 해볼게요. 근데 그럼 k는 최대 10만 - 1 이니까 -100 X (10만 - 1) 이런 식으로 하게 되겠죠.

근데 이렇게 쓰면 귀찮으니까

이렇게 해보면은 어림잡아 -1000만이라고 볼 수가 있겠죠.

이렇게 해서 '아 이 문제의 최소값은 -1000만이구나' 하고 들어가는 거예요.

근데 지금 보시면 -100004라고 했죠? 이거는 뭐냐면 이 문제는 사실은 -1000만으로 해도 돼요.

근데 사실 문제를 풀다 보면 사이가 아닐 때도 있고, -1000만이 문제 답의 범위에 걸치고 -1000만 - 1를 해가지고 -1001만부터 해야 되는 그런 문제들이 있을 거예요.

그래서 끝점(-1000만)보다는 더 약간 버퍼 같은 역할을 하는 어떤 수를 넉넉하게 마이너스를 해주거나, 플러스 해주는게 좋다고 교안에 쓴 적이 있을 겁니다.

그래서 이거는 약간 팁같은거에요. 이렇게 해야 문제를 디버깅할 때 맞왜틀, '어 이거 맞는데 왜 틀리지' 이런 거에 안 걸릴 수 있다 라는 겁니다.

코드는 위와 같습니다. 최대값에다가 최소값을 넣어 비교하는 것과 범위에 유의하시면 됩니다.

'10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트 > 알고리즘 문제풀이' 카테고리의 다른 글

1-J  (0) 2024.03.13
1-I  (0) 2024.03.13
1-G  (0) 2024.03.09
1-F  (0) 2024.03.08
1-E  (0) 2024.03.06