
문제 링크
코딩테스트 연습 - [3차] 파일명 정렬
알고리즘 문제 연습 카카오톡 친구해요! 프로그래머스 교육 카카오 채널을 만들었어요. 여기를 눌러, 친구 추가를 해주세요. 신규 교육 과정 소식은 물론 다양한 이벤트 소식을 가장 먼저 알려
school.programmers.co.kr
접근 방법
파일명을 HEAD, NUMBER로 나눈 뒤 정렬 기준에 맞게 정렬합니다.
HEAD를 기준으로 사전순 정렬합니다. 이때 대소문자는 구분하지 않습니다.HEAD가 같다면NUMBER를 숫자로 변환하여 오름차순 정렬합니다.HEAD와NUMBER가 모두 같다면 입력 순서를 유지합니다.
소스 코드
import java.util.*;
class Solution {
class Node implements Comparable<Node> {
String head;
int num;
int idx;
public Node(String head, int num, int idx) {
this.head = head.toLowerCase();
this.num = num;
this.idx = idx;
}
public int compareTo(Node o) {
int headCompare = this.head.compareTo(o.head);
if (headCompare != 0) {
return headCompare;
}
int numCompare = Integer.compare(this.num, o.num);
if (numCompare != 0) {
return numCompare;
}
return Integer.compare(this.idx, o.idx);
}
}
public String[] solution(String[] files) {
List<Node> arr = new ArrayList<>();
for (int i = 0; i < files.length; i++) {
int startIdx = 0;
while (!Character.isDigit(files[i].charAt(startIdx))) {
startIdx++;
}
int endIdx = startIdx;
while (
endIdx < files[i].length()
&& Character.isDigit(files[i].charAt(endIdx))
&& endIdx - startIdx < 5
) {
endIdx++;
}
String head = files[i].substring(0, startIdx);
int num = Integer.parseInt(files[i].substring(startIdx, endIdx));
arr.add(new Node(head, num, i));
}
Collections.sort(arr);
String[] answer = new String[files.length];
for (int i = 0; i < files.length; i++) {
Node node = arr.get(i);
answer[i] = files[node.idx];
}
return answer;
}
}
코드 설명
Node 클래스는 정렬에 필요한 정보를 저장하는 클래스입니다.head에는 파일명의 HEAD 부분을 소문자로 변환하여 저장합니다. 문제에서 HEAD는 대소문자를 구분하지 않고 비교해야 하기 때문입니다.num에는 NUMBER 부분을 정수로 변환하여 저장합니다. 숫자 앞의 0은 정렬에 영향을 주지 않기 때문에 Integer.parseInt()를 사용합니다.idx에는 원래 입력 배열에서의 위치를 저장합니다. HEAD와 NUMBER가 모두 같을 때 입력 순서를 유지하기 위해 사용합니다.
파일명을 순회하면서 처음으로 숫자가 등장하는 위치를 찾습니다. 이 위치가 NUMBER의 시작 위치이고, 그 앞부분이 HEAD가 됩니다.
NUMBER는 연속된 숫자이면서 최대 다섯 글자까지 가능하므로, 숫자가 아닌 문자를 만나거나 다섯 자리를 초과하면 탐색을 멈춥니다.
compareTo()에서는 먼저 head를 비교합니다. head가 다르면 사전순으로 정렬합니다.head가 같으면 num을 비교합니다. num까지 같으면 idx를 비교하여 원래 입력 순서가 유지되도록 합니다.
정렬이 끝난 뒤에는 Node에 저장된 idx를 이용해 원본 files 배열에서 파일명을 꺼내 정답 배열에 저장합니다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스 JAVA] 150368. 이모티콘 할인행사 (0) | 2026.05.08 |
|---|---|
| [프로그래머스 JAVA] 258707. n + 1 카드게임 (0) | 2026.05.02 |
| [프로그래머스 JAVA] 68936. 쿼드압축 후 개수 세기 (0) | 2026.04.23 |
| [프로그래머스 SQL] 301649. 대장균 크기에 따라 분류하기 2 (0) | 2026.04.09 |
| [프로그래머스 SQL] 131114. 경기도에 위치한 식품창고 목록 출력하기 (0) | 2026.04.07 |