문제 링크
- https://school.programmers.co.kr/learn/courses/30/lessons/17686#
문제 설명
1. `HEAD` : 문자로만 이뤄진 부분
2. `NUMBER` : 숫자로만 이뤄진 부분
3. `TAIL` : 그 나머지
파일명을 위의 세 부분으로 나눠서 파일들을 정렬해야한다.
정렬 방법
1. HEAD를 사전순으로 정렬(대소문자 구분 X)
2. NUMBER를 오른차순으로 정렬
3. 1, 2번이 모두 같으면, 기존에 주어진 순서를 유지
문제 풀이
1. file들을 `head`, `number`, `tail`로 구분해 문자일 때, 숫자일 때 그 나머지를 각각 넣어준다.
- 여기서 char을 쓰면 숫자/문자 구분이 편한 것 같아 자주 쓰고 있다.
2. 위의 정렬대로 정렬한다.
- 대소문자 구분해 주지 않기 위해, `head`를 모두 소문자로 바꿔준다.
- 숫자 구분은 `Integer.compare(숫자1, 숫자2)`와 문자 구분은 `문자1.compareTo(문자2)` 부분이 조금 헷갈렸음!
- primitive 타입인 int형들을 구분하기 위해서는 `Comparator` 인터페이스를 사용하고, 객체를 구분하기 위해서는 `Comparable` 인터페이스를 사용
import java.util.*;
class Solution {
static class File {
String origin, head, number, tail;
File(String origin, String head, String number, String tail) {
this.origin = origin;
this.head = head;
this.number = number;
this.tail = tail;
}
}
public String[] solution(String[] files) {
List<File> fileList = new ArrayList<>();
for(String file : files) {
StringBuilder head = new StringBuilder();
StringBuilder number = new StringBuilder();
StringBuilder tail = new StringBuilder();
int idx = 0;
// HEAD
while(idx < file.length() && !(file.charAt(idx) >= '0' && file.charAt(idx) <= '9')) {
head.append(file.charAt(idx++));
}
// NUMBER
while(idx < file.length() && file.charAt(idx) >= '0' && file.charAt(idx) <= '9') {
number.append(file.charAt(idx++));
}
while(idx < file.length()) {
tail.append(file.charAt(idx++));
}
fileList.add(new File(file, head.toString(), number.toString(), tail.toString()));
}
// 정렬 1. head 순 2. number 순 3. arr순
fileList.sort((f1, f2) -> {
int headCom = f1.head.toLowerCase().compareTo(f2.head.toLowerCase());
int num1 = Integer.parseInt(f1.number);
int num2 = Integer.parseInt(f2.number);
if (headCom == 0) {
return Integer.compare(num1, num2);
}
return headCom;
});
String[] answer = new String[files.length];
for(int i = 0; i < fileList.size(); i++) {
answer[i] = fileList.get(i).origin;
}
return answer;
}
}
'알고리즘' 카테고리의 다른 글
| [알고리즘] 선택정렬(Selection Sort) (4) | 2026.01.09 |
|---|---|
| [Java-투포인터] 두 배열 합쳐서 정렬하기 (0) | 2025.12.30 |
| [프로그래머스 - LV2] [1차] 프렌즈4블록 (2) | 2025.10.08 |
| [프로그래머스 - LV2] 이모티콘 할인행사 (1) | 2025.10.07 |
| [프로그래머스 - LV2] [1차]뉴스 클러스터링 (0) | 2025.10.06 |
