프로그래머스/자바 Lv2
[프로그래머스] Java Lv2. 코딩테스트 연습 > 2018 KAKAO BLIND RECRUITMENT > [3차] 파일명 정렬 17686
행수쌤
2024. 11. 4. 16:02
728x90
반응형
문제설명
- 파일명이 HEAD, NUMBER, TAIL 세 부분으로 구성되어 있다.
- 파일명은 우선 대,소문자 구분 없이 HEAD 부분을 기준으로 사전 순으로 정렬한다.
- 파일명의 HEAD 부분이 대소문자 차이 외에는 같을 경우, NUMBER의 숫자 순으로 정렬한다.
- 두 파일의 HEAD 부분과 NUMBER의 숫자도 같을 경우, 원래 입력에 주어진 순서를 유지한다.
접근방법
- 파일명에서 처음 나오는 숫자를 기준으로 HEAD, NUMBER, TAIL을 구분.
- 정렬 기준에 따라 sort 진행
핵심로직
- 파일명의 형태가 정해져 있으므로 숫자, 문자를 기준으로 split 하여 HEAD와 NUMBER를 찾아낸다.
- 찾아낸 HEAD와 NUMBER를 토대로 문제에서 요구하는 기준에 따라 정렬 값 return
입출력 예
- 입력: ["img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG"]
- 출력: ["img1.png", "IMG01.GIF", "img02.png", "img2.JPG", "img10.png", "img12.png"]
코드 작성(1차)
import java.util.*;
class Solution {
public String[] solution(String[] files) {
Arrays.sort(files, (a, b) -> {
String[] partsA = new String[2];
partsA[0] = a.split("\\d")[0];
partsA[1] = a.split("\\D+")[1];
String[] partsB = new String[2];
partsB[0] = b.split("\\d")[0];
partsB[1] = b.split("\\D+")[1];
if(!partsA[0].toLowerCase().equals(partsB[0].toLowerCase())) {
return partsA[0].toLowerCase().compareTo(partsB[0].toLowerCase());
} else if (Integer.parseInt(partsA[1]) != Integer.parseInt(partsB[1])) {
return Integer.parseInt(partsA[1]) - Integer.parseInt(partsB[1]);
} else {
return 0;
}
});
return files;
}
}
a와 b의 HEAD, NUMBER를 추출하는 코드가 중복되고, rank를 비교 하는 메서드를 사용해서 코드를 간결하게 만들어주도록 한다.
코드 작성(2차)
import java.util.*;
class Solution {
public String[] solution(String[] files) {
Arrays.sort(files, (a, b) -> {
// 파일 이름을 HEAD와 NUMBER로 분리
String[] partsA = splitFileName(a);
String[] partsB = splitFileName(b);
// HEAD 비교
int headCompare = partsA[0].compareToIgnoreCase(partsB[0]);
if (headCompare != 0) {
return headCompare;
}
// NUMBER 비교
int numA = Integer.parseInt(partsA[1]);
int numB = Integer.parseInt(partsB[1]);
return Integer.compare(numA, numB);
});
return files;
}
// 파일 이름을 HEAD와 NUMBER로 분리하는 메소드
private String[] splitFileName(String file) {
String head = file.split("\\d")[0];
String number = file.substring(head.length()).split("\\D+")[0];
return new String[]{head, number};
}
}
728x90
반응형