Problem Solving

BOJ 18866 : 젊은 날의 생이여

onaeonae1 2020. 8. 23. 23:23

https://www.acmicpc.net/problem/18866

 

18866번: 젊은 날의 생이여

욱제의 젊은 날이 될 수 있는 최대 기간, 즉 문제의 조건을 만족할 수 있는 최대의 1 ≤ K < N을 출력한다. 단, 이러한 K가 없을 경우, -1을 출력한다.

www.acmicpc.net

한 2달전쯤에 틀렸던 문제인데, 주말에 심심해서 풀어봤다.

 

문제에서 주어진 조건은 다음과 같다.

 

  • N개의 날 중, 1~ K까지는 젊은 날, K+1~N까지는 늙은 날이다.
    • 임의의 젊은 날의 행복도는 임의의 늙은 날의 행복도보다 높다.
    • 임의의 젊은 날의 피로도는 임의의 늙은 날의 피로도보다 낮다.
  • 가끔 행복도, 피로도에 누락된 값이 있는데, 이는 0으로 표현된다.
  • 이때 가능한 최대 젊은 날을 만족하는 수 K를 구하라

 

조건을 풀어서 써보면,

 

  • 젊은 날의 최소 행복도는 늙은 날의 최대 행복도보다 높다.
  • 젋은 날의 최대 피로도는 늙은 날의 최소 피로도보다 높다.

따라서, 젊은 날의 경우는 1~N까지 돌면서 최소 행복도, 최대 피로도를 젊은 날 배열에 저장하고,

늙은 날의 경우는 N~1까지 (거꾸로) 돌면서 최대 행복도, 최소 피로도를 늙은 날 배열에 저장한다.

(이때 0의 경우는 일단 최대,최소 갱신에 사용하지 않는다.)

 

그리고 (K-1)~1 까지 돌면서 젊은 날로 지정하고, (당연히 그 뒤에 칸부터는 늙은 날) 위의 조건을 만족하는지 판별한다.

다시 말해, 뒤에서부터 모든 K에 대해 판별한다.

정확히 말하자면, K번째 칸이 젊은 날일때,

 

  • 1~K까지의 최소 행복도 < K+1~N까지의 최대 행복도
  • 1~K까지의 최대 피로도 < K+1~N까지의 최소 피로도

이 두가지 조건을 만족하면 된다는 것이다. 앞서 배열들을 돌면서 값을 기록해 뒀으니 비교는 쉽게 할 수 있다.

그리고 0의 경우 헷갈릴 수 있는데, 0은 아무 값이나 대입될 수 있다는 것을 떠올려 보면 된다.

 

시간 복잡도에 대해서는 딱히 문제될 것이 없다. 모두 O(N) 이다.

 

소스코드는 깃허브에 올려두었다.

https://github.com/onaeonae1/ProblemSovling/blob/master/BOJ%2018866.cpp

 

onaeonae1/ProblemSovling

Problem Solving(BOJ/AOJ/Programmers) with C++. Contribute to onaeonae1/ProblemSovling development by creating an account on GitHub.

github.com

 

*백준에는 부분합이라고 분류되어 있는데, 부분합을 딱히 쓰지는 않는다. 어떤 알고리즘으로 분류해야 할 지 모르겠다.