나 개발자 진짜 되냐?

바킹독 0x02 문제27 - 최댓값 / 백준 2562번 본문

C++을 시작해봐요!/알고리즘을 공부해봐요!

바킹독 0x02 문제27 - 최댓값 / 백준 2562번

Snow Rabbit 2025. 9. 15. 22:08

몇 달 만인가....

기초..... 코드 작성요령.. 파트.. 0x02 부분 마지막

최댓값이다.

너무 푼 지 오래되어.. 앞에 1번은 다시 기억이 가물가물 가물치이다.

 

이래서 강의는 언제 다 듣고

언제 다 풀래!!

 

문제를 더 많이 풀어봐야 하나? 싶다.


 

 

분명 최댓값.. 한 거 같긴 한데.. max 이런 거 들어갔던 거 같은데 기억이 안 난다.

날 리가 있나.

 

 

여기서 중요한 건

인덱스 이기 때문에

웬만해서는 int를 i부터 시작하는 게 좋다

안 그러면 마지막에 출력할 때 +1을 해줘야 한다..!!

 

새로운 stl 친구를 데려왔다

그 친구 이름은

max_element

배열, 벡터에 모두 사용이 가능한 친구

컨테이너 ( 배열, 벡터 ) 구간에서 최댓값을 찾아주는 함수!!

 

auto it = max_element(시작, 끝);

 

auto는 타입을 자동으로 추측해 주는 자료형

근데 이게 있으면 굳이 다른 걸 쓸 필요 있나

다 auto로 쓰면 되는 거 아닌가.. 싶기도 하고.. 여서 물어봤는데

안된단다..ㅋㅋ 뭐 가독성이 많이 떨어진다고 한다.

의도치 않는 버그도 생길 수도 있다고 한다.

같은 숫자여도 소수점이거나 막 9.0 이면 막 float인지 double인지 헷갈린다고 한다.

사실 9.0은 정수... 긴하지 않나? 흠....ㅋㅋㅋ

 

그렇다.

 

다시 돌아가서 시작과 끝을 써주면 되는데

배열의 경우 시작과 끝을

( arr, arr +N )

벡터의 경우

( v.begin(), v.end() )

 

max_element의 매우 큰 특징이 있는데

그것은 이 친구가

최댓값 그 자체를 주는 게 아니라

최댓값이 저장된 위치를 준다.

즉 그 값이 it*인 거!

 

그래서 윗 식처럼 계산하게 된다면

it에는 주소값이 나오게 된다 0x82ca.. 어쩌고

 

그래서 우리는 값이 필요하기 때문에 앞에

또 *별을 붙여줘야 한다.

그래서 별 두 개로 상쇄시켜야 한다..!!

그럼 값이 되겠지!

 

 

오케이 별을 붙이는 건 알겠어.

 

별을 붙임으로써 그 주소에 있는 값을 출력하는 거겠지

그렇다면 도대체 두 번째 줄에 -a를 빼는 이유는 뭘까??

 

max_element(a, a+9) 값이 최댓값 주소인데

거기서 -a를 빼면

인덱스 차이값이 나오게 된다는 것이다.

 

아니 a를 빼는데 어떻게 그런 거지? 나는 여기서 이해를 못 했다.

a가 뭐길래?

했는데 배열이름 a라는 이름은

배열의 첫 번째 칸 주소를 의미한다고 한다.

 

a는 사실상 주소 역할인 것.

 

그래서 두 번째 max_element 값이 최댓값의 주소니까

거기에서 a를 빼주면 그 차이 값이 나오고

0부터 시작했으니+1 해주면 된다.

 

와.. 포인터 c#에서는 잘 본 적도 없는 게 나와가지고 굉장히 머리 아프게 한다.

포인터.. 절망적이네...

그래도 벡터로 가면 포인터 쓸 일이 조금 줄어든다고 하긴 하는데..

 

이 max_element는 애초에 반환이 이터레이터 ( 주소 ) 이므로 *이 필요하다고 한다.

 

어렵다 어려워.

 

이렇게..

마지막에 맛없는 포인터까지 살짝 맛보고.. 끝냈다.

맛이 정말 없어서 안 먹고 싶은데..

앞으로 계속 나오겠지

STL은 앞으로 하나씩 익혀야겠다. 

참 어렵다.

그냥 어렵다 이 말 밖엔

그래도 몇 달 동안이 거 스물일곱 문제 푸느라 ㅋㅋㅋㅋ

고생했다

고생한 건가? 고생한 거 아닌가? 잘 모르겠지만

 

다음 파트에서 보자!!