세로형
Recent Posts
Recent Comments
Link
11-25 00:03
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

꿈 많은 사람의 이야기

펄(perl) 정렬(sort) 제대로 해보자(<=>를 이용) 본문

perl

펄(perl) 정렬(sort) 제대로 해보자(<=>를 이용)

이수진의 블로그 2017. 11. 14. 10:30
반응형
728x170

지난번 포스팅에서 배열 정렬에 관해서 잠깐 다루었었습니다.

http://lsjsj92.tistory.com/94

 

이 글을 보시면 배열에 관해 정리하면서 정렬도 다루었었는데요

sort 함수를 사용하면 정렬은 가능하지만 완벽하지는 않습니다.

예를들어 아래와 같은 상황이 발생되죠

숫자를 정렬한다고 가정합시다

 

숫자가 들어있는 somelist 배열에는 1,2,4,~ 256의 숫자가 들어있습니다.

그걸 sort 함수를 이용해서 정렬을 하면 아래와 같이 출력됩니다

 

 

이상하죠?

내가 원했던 정렬은 1,2,4,8 순서대로 가는 정렬인데요

1, 128, 16, 2, 256, 32, 4, 64, 8 순으로 정렬이 되어 있습니다.

자세히 보면 가장 맨 앞 숫자는 순서대로 작은 값입니다.

즉 정렬이 아스키값으로 정렬이 되기 때문에 저런 상황이 발생되는 겁니다.

그러면 이 정렬을 어떻게 제대로 하나?

먼저 정석적인 방법을 알아보겠습니다.

함수를 만들어서 2개의 인자를 받습니다.

그리고 2번째 인자가 1번째 인자보다 크면 -1, 같으면 0, 첫번째 인자가 크면 1이 반환되는 거죠

 

 

이렇게 함수를 만듭니다

 

 

그리고 sort 함수를 by_number 즉 방금 만든 정렬 함수에 보내고 그 인자로 @somelist 배열을 보내줍니다.

그리고 반환되는 값을 @secondsort에 받게 되죠

 

자 그럼 정렬이 되었네요!

근데 이렇게 하면 너무 힘들죠

귀찮기도 하고요

그래서 펄은 <=> 연산을 제공합니다

-1, 0, 1로 정렬하는 것을 즉 by_number 안에 썼던 내용을 <=>으로 간단하게 끝낼 수 있다는 겁니다.

 

위 처럼요

그러면 처음 작성했던 by_number와 기능이 똑같아 집니다!

정말 간단하죠?

그리고 아래처럼 사용도 가능해요

바로 sort { $a <=> $b } 를 넣어버리는 거죠

 

저렇게요!

저렇게 하면 신기하게도 정렬이 된답니다

 

 

정렬이 되었습니다

 

 

그리고 뭐 문자는 상관없는거 같더라고요

어차피 아스키로 비교하는거니까요

 

여기까지 펄 정렬에 대해서 자세히 알아봤습니다

반응형
그리드형
Comments