줄 정렬 및 중복 제거기
텍스트 줄을 A→Z 또는 Z→A 순으로 정렬하고, 중복되거나 빈 줄을 제거하며, item2가 item10보다 먼저 오도록 자연스러운 숫자 순서로 바로잡습니다 — 모든 처리가 브라우저 안에서 즉시 이루어집니다.
조회수 222회
일반 알파벳순 정렬에서 "item10"이 "item2"보다 앞에 오는 이유
표준 정렬 방식 — JavaScript의 Array.sort() 메서드나 스프레드시트의 A→Z 버튼 뒤에 있는 방식 — 은 각 문자의 유니코드 코드 포인트를 기준으로 두 줄을 왼쪽에서 오른쪽으로 한 문자씩 비교합니다. 연속된 숫자를 하나의 완전한 수로 보지 않고, 오직 한 문자가 다른 문자보다 작은지 큰지를 한 자리씩 판단할 뿐입니다. 그래서 item1, item2, item9, item10, item20을 포함한 목록은 문자 단위 비교로 item1, item10, item2, item20, item9 순으로 정렬됩니다. "item10"과 "item2"를 한 글자씩 비교하면 "item"까지는 완전히 같고, 바로 다음 문자가 모든 것을 결정합니다 — "1"과 "2"의 비교입니다. 문자 "1"이 문자 "2"보다 작기 때문에, 십이 이보다 수치상 크더라도 item10이 item2보다 앞에 정렬됩니다. 텍스트 안에 숫자가 포함된 모든 목록이 이 문제를 겪습니다: 버전 번호, image2.jpg와 image10.jpg 같은 파일명, 청구서 번호, 단계별 지침 등이 그렇습니다.
자연 정렬(숫자 정렬이라고도 함)은 연속된 숫자를 하나의 수로 인식하고 한 자리씩 비교하는 대신 그 값을 비교하여 이 문제를 해결합니다. 이 도구의 자연 정렬 옵션은 이 로직을 브라우저에 내장된 Intl API에 위임하여, 모든 줄 쌍에 대해 a.localeCompare(b, undefined, {numeric: true, sensitivity: "base"})를 실행합니다. numeric:true 플래그는 비교 과정에 연속된 숫자를 감지하여 수로 취급하도록 지시하므로, item2는 item10보다, item9는 item20보다 정확히 앞에 위치하게 됩니다 — 이는 문자 단위 비교가 만들어내는 순서가 아니라, 목록을 읽는 사람이 기대하는 순서입니다.
문자 코드만이 아닌, 로케일을 고려한 비교
알파벳 순서는 또한 어떤 언어의 규칙이 적용되는지에도 좌우되며, 숫자가 전혀 관련되지 않은 경우에도 단순 비교는 여기서 무너집니다. 영어에서는 "a"와 "A"가 대소문자만 다른 같은 문자이고, é 같은 악센트 문자는 보통 e 근처에 정렬됩니다. 반면 튀르키예어에서는 "ı"(점 없는 i)와 "i"(점 있는 i)를 알파벳에서 각자 고유한 위치를 가진 서로 다른 두 글자로 취급합니다 — 이는 숫자로 된 유니코드 값만 확인하는 단순 코드 포인트 비교로는 전혀 알 수 없는 구분입니다. 자연 정렬 옵션의 기반이 되는 것과 동일한 Intl 메서드인 localeCompare는 로케일 규칙을 고려합니다. sensitivity: "base"를 사용하면 대소문자와 악센트 차이를 정렬 목적상 동등하게 취급하면서도, 영어든 튀르키예어든 독일어든 또 다른 라틴 문자 언어든 각 알파벳의 실제 글자 순서는 그대로 존중합니다.
이 도구는 두 가지 요소를 한 번에 결합합니다: 기본 순서로 알파벳 A→Z 또는 Z→A를 선택하고, 필요하다면 자연 숫자 정렬을 추가로 적용하여 텍스트에 포함된 숫자가 자릿수가 아니라 값으로 비교되도록 한 다음, 필요에 따라 중복된 줄, 빈 줄, 앞뒤 공백을 제거할 수 있습니다. 중복 검사는 줄을 정확한 문자열로 비교하므로 공백 제거(trim)가 중요합니다: 끝에 공백이 있는 "apple "과 "apple"은 그 공백을 먼저 제거하지 않으면 중복 검사에서 서로 다른 줄로 보입니다. 그래서 공백 제거와 중복 제거 옵션은 서로 무관한 별개의 스위치가 아니라 함께 작동하도록 설계되었습니다.
자주 묻는 질문
목록을 정렬하면 왜 "item10"이 "item2"보다 먼저 나타나나요?
단순 알파벳 정렬은 연속된 숫자를 하나의 정수로 취급하지 않고 텍스트를 한 문자씩 비교하기 때문입니다 — 문자 "1"이 "2"보다 작으므로, 십이 이보다 크더라도 item10이 이 한 자리 비교에서 이깁니다. 이를 해결하려면 자연/숫자 정렬을 켜세요: 연속된 숫자를 하나의 수로 감지하여 개별 문자가 아니라 크기를 비교합니다.
정확히 어떤 줄이 "중복"으로 간주되나요?
두 줄은 대소문자와 앞뒤 공백까지 포함하여 완전히 일치할 때만 중복으로 간주됩니다 — "Apple"과 "apple"은 서로 다른 줄로 취급되며, 끝에 공백이 있는 "banana "도 "banana"와 다른 줄로 취급됩니다. 공백 차이를 무시하고 싶다면 중복을 제거하기 전에 공백 제거 옵션을 활성화하세요.
공백을 제거하면 삭제되는 중복 개수가 달라지나요?
네. 그 외에는 동일한 두 줄이 앞뒤 공백만 다르다면, 공백을 제거하기 전까지는 서로 다른 줄로 계산됩니다. "앞뒤 공백 제거" 옵션을 선택하면 중복 검사가 실행되기 전에 두 줄이 모두 정규화되어, 이러한 거의 동일한 줄들이 하나로 합쳐집니다.
localeCompare는 튀르키예어나 독일어처럼 영어가 아닌 텍스트를 정렬할 때도 신뢰할 수 있나요?
네 — localeCompare는 로케일에 맞는 정확한 정렬을 위해 특별히 설계된 브라우저 내장 기능이므로, 튀르키예어에서 점 있는 "i"와 점 없는 "ı"를 별개의 글자로 취급한다는 것을 알고 있으며, 일반적으로 악센트 문자도 해당 언어 사용자가 기대하는 방식으로 처리합니다. 이는 원시 유니코드 코드 포인트에 기반한 단순 크기 비교로는 할 수 없는 일입니다.
이 도구가 제 텍스트를 어딘가에 업로드하거나 저장하나요?
아니요 — 모든 처리는 JavaScript를 사용해 브라우저에서 로컬로 실행되며, 줄이 서버로 전송되거나 기록되거나 저장되는 일은 없습니다. 탭을 새로고침하거나 닫으면 입력 내용이 완전히 지워집니다.
비슷한 도구
문제 신고하기
줄 정렬 및 중복 제거기
댓글
아직 댓글이 없습니다 — 첫 댓글을 남겨보세요!