boj 11501번 문제를 통해 배우게되는, 이미 다 받아들인 값을 통해서는 역으로도 연산을 해나갈 수 있다는 점에 대하여.

일단 이 문제의 경우 앞으로 다가올 날들에 대한 정보를 이미 싹 다 주었기 때문에, 이것을 for문을 통해서 배열에 모두 값을 저장했다. 

그렇기 때문에 머리속에서는 앞으로 나아가면서 최고로 큰 날이 다가오는걸 어떻게 알 수 있을까 생각할때, 정렬을 이용한다던지 max_element를 이용한다던지 등을 떠올리다가, 굉장히 비효율적이게 느껴지는 방법들, 혹은 일관성이 없는 풀이들이 떠올랐는데, 정답 코드를 참고해보니 이 문제의 경우는 for문을 통해서 이미 모든 날짜별 주가를 다 받아들였기 때문에, 시작 위치를 맨 끝부터 뒤로 역순으로 진행하면서 연산을 수행할 수 있다는걸 이용해서, 미래를 알고 있는 듯한 느낌을 낼 수 있다는걸 알 수 있었다. 

 

컴퓨터의 경우 결국 for문으로 모든 정보를 다 기입받았으면, 역순으로도 그 데이터들을 활용해서 연산을 수행할 수 있기 때문에 그 점을 잘 이용해서 문제를 해결하고, 효율적인 연산 방법을 생각해본다면 다음에도 이러한 형태의 미래의 정보를 주고 그것들을 이용해서 적절한 최대값 등을 구할때 활용할 수 있을것 같다. 

잘 활용해 보도록 하자. 

그리고 핵심이 되는 부분은 결국, 

for(int i=n-2;i>=0;i--){
    if(a[i]>max_val) max_val=a[i];
    ans+=max_val-a[i];
    }

이 부분인데, 이 부분의 경우 값이 더 커진 경우가 등장하면 max_val을 a[i]로 바꾸고 난뒤, 그 뒤에 다시 a[i]을 빼주는 연산을 통해서 ans에 더해줄 부분이 0이 되면서 음수가 더해지지 않으면서도 양수가 더해지는 일 또한 없게 만들어주는걸 볼 수 있다. 

이러한 관계식에 익숙해지고 다음에도 미래에 대한 정보를 주고, 컴퓨터가 for문으로 모두 읽어들이고, 그리고 그걸 시간이 지나면서 최대값 등을 구하거나 할때는, 역연산으로 되돌리면서 계산할 수 있다는걸 알아두고 그걸 활용해보도록 하자. 

이 코드를 잘 기억하자. 

 

  Comments,     Trackbacks