인프런 커뮤니티 질문&답변

ymh_0825님의 프로필 이미지
ymh_0825

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

교안 compare 함수 질문

작성

·

144

·

수정됨

0

안녕하세요 큰돌님. 120p string으로 이루어진 배열을 정렬한 코드에 대해 질문드립니다.

제가 이해한 바로는 compare라는 함수는 문자열의 길이를 비교하는 함수입니다.

  1. if(a.size() == b.size()) return a < b; 는 문자열의 길이가 같으면 a b 크기를 비교합니다. 이 때 비교하는 기준은 아스키 코드입니다.

  2. 만약 문자열의 길이가 같지 않으면 크기를 비교해서(아스키코드 기준) 바로 boolean 값을 반환합니다.

  3. 111은 222와 아스키코드적으로 비교를 하게되는데.. 이때 1의 아스키코드는 49이고 2의 아스키 코드는 50입니다. 111이 a, 222가 b 이니까 a < b 는 T가 됩니다.

  4. 111은 이제 33과 비교를 하게 됩니다. if문에 해당이 되지 않기때문에 바로 return a.size() < b.size() 를 하게 됩니다. a가 111, 33이 b이고 a의 size는 3, b의 size는 2입니다. 결과적으로 F가 됩니다.

여기서 드리고 싶은 질문은

  1. F가 되면 순서를 바꾸는건가요? 그렇담 왜 33,222,111 가 되지 않는건가요?

  2. 111과 33은 아스키코드순으로 비교할 필요가 없지 않나요? 자릿수가 다르니까 a < b를 할 필요가 없을텐데.. 왜 교안에는 아스키코드순으로 비교한다는 내용이 실려져 있는건가요? 없어도 되는 내용인것 같은데…. 실려져 있어서 제가 잘못 알고있는건지 너무 헷갈립니다…

답변 1

1

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 0825님 ㅎㅎ

111은 이제 33과 비교를 하게 됩니다. if문에 해당이 되지 않기때문에 바로 return a.size() < b.size() 를 하게 됩니다. a가 111, 33이 b이고 a의 size는 3, b의 size는 2입니다. 결과적으로 F가 됩니다

>> 네 맞습니다.

bool compare(string a, string b){
	if(a.size() == b.size()) return a < b; 
	return a.size() < b.size();
}  

111과 33을 하게 되면 false가 나오게 됩니다.

 

 

  1. F가 되면 순서를 바꾸는건가요? 그렇담 왜 33,222,111 가 되지 않는건가요?

>> 순서를 바꾸기는 하지만 그렇게 한번만 바꾸지는 않습니다.

이 compare의 역할은 SORT의 compare함수를 만드는 것입니다. sort함수는 내부적으로 순서가 여러번 변경되며 이를 우리가 파악하기는 어렵습니다. 다만, 기본적으로 < 오퍼레이터에 맞춰 compare함수를 만들어주어야 합니다.

그렇게 한 뒤 sort를 작동시키게 되면 해당 기준에 맞춰서 정렬되는 것을 볼 수 있게 됩니다.

즉,

111 과 33 : false -> 33, 111이라는 순서.

111과 222 : true -> 111, 222 라는 순서.

33과 222 : true -> 33, 222라는 순서.

등을 기반으로.

정렬이 일어나서 33, 111, 222가 완성되게 됩니다.

 

111과 33은 아스키코드순으로 비교할 필요가 없지 않나요?

>> 해당 부분은 자리로 비교하게 됩니다.

	return a.size() < b.size();

 



 


또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.



ymh_0825님의 프로필 이미지
ymh_0825

작성한 질문수

질문하기