프로그래머스 코딩테스트 문제중 카카오톡에 나왔던 파일명 정렬을 풀어보았다.
문제는 아래와 같다.
https://programmers.co.kr/learn/courses/30/lessons/17686
코딩테스트 연습 - [3차] 파일명 정렬
파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램��
programmers.co.kr
요점은
1.파일명을 세등분하고 2. 세등분한 것을 이용하여 다중조건으로 정렬
을 하면 되는데 다행이 이와 관련된 것을 이미 해보아서 금방할 수 있었다.
문자열을 세등분 하는 것은 이전에 내가 했던 개인정보검출을 응용하였고
'프로그래밍공부/자바' 카테고리의 글 목록
이것저것 기록하기 위한 블로그 ^-^
sheriffchae.tistory.com
다중조건의 경우 이전에 본 경험이 있어서 아래 블로그를 참조했다.
https://chickenpaella.tistory.com/24
다중 조건 정렬
여러 조건을 만족하는 정렬을 구현해보자. 우선 정렬할 객체를 생성할 클래스를 작성한다. 여기서는 Student로 하겠다. 1 2 3 4 5 6 7 8 9 10 11 class Student { int num; String name; ..
chickenpaella.tistory.com
결과는 합격.
코드는 아래와 같다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Comparator;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
class Solution {
public String[] solution(String[] files) {
//정렬을 위한 자료구조
List<File> list = new ArrayList<File>();
//String headRe = "[a-zA-Z]+";
String numRe = "[0-9]{1,5}";
//String tailRe = "[a-zA-Z]+[0-9]+?";
int index=0;
//head number tail을 구분하기위한 로직.
for(String fileName:files){
Pattern pattern = Pattern.compile(numRe);
Matcher matcher = pattern.matcher(fileName);
int start = 0;
int last = 0;
if(matcher.find()){
start=matcher.start(); //number시작인덱스
last=matcher.end(); //number 마지막인덱스
}
//파일이름에서 head와 number, tail을 인덱스를 이용하여 추출해 낸다.
String head = fileName.substring(0,start);
String number = fileName.substring(start,last);
String tail = fileName.substring(last,fileName.length());
list.add(new File(head,Integer.parseInt(number),tail,index));
index++;
}
//정렬
Collections.sort(list, new FileCompare());
String[] answer = new String[list.size()];
index=0;
//답을 추출해내는 곳.
for(File file:list){
answer[index]=files[file.index];
index++;
}
return answer;
}
//자료를 저장하기위한 클래스
class File {
String head;
int number;
String tail;
int index;
public File(String head,int number,String tail,int index){
this.head=head;
this.number=number;
this.tail=tail;
this.index=index;
}
}
//다중조건으로 비교하기위한 클래스
//순서는 head-number-index순이다.
class FileCompare implements Comparator<File> {
int ret=0;
@Override
public int compare(File o1, File o2) {
//대소문자구분없이 비교하기 위해 toLowerCase사용
if(o1.head.toLowerCase().compareTo(o2.head.toLowerCase()) < 0){
ret = -1;
}
if(o1.head.toLowerCase().compareTo(o2.head.toLowerCase()) == 0 ) {
if(o1.number == o2.number){
//head, number가 같은경우 인덱스가 빠른쪽이 앞에오도록 한다,
//(그래야 원래 순서와 변함이 없다.)
if(o1.index > o2.index) {
ret = 1;
} else if(o1.index == o2.index) {
ret = 0;
} else if(o1.index < o2.index ) {
ret = -1;
}
} else if(o1.number < o2.number) {
ret = -1;
} else if(o1.number > o2.number) {
ret = 1;
}
}
if(o1.head.toLowerCase().compareTo(o2.head.toLowerCase()) > 0) {
ret = 1;
}
return ret;
}
}
}
만약 여기서 한단계 더 나아간다면 head number tail을 구하는 로직이 반복되기 때문에 따로 메소드로 만들어주면
더 깔끔해질 것이다
-끝-
'프로그래밍공부 > 알고리즘' 카테고리의 다른 글
코딩테스트-알고리즘-등굣길 (0) | 2020.08.06 |
---|---|
코딩테스트 - 정수삼각형 (0) | 2020.08.06 |
코딩테스트 - 문자열 압축 (0) | 2020.08.04 |
카카오톡 코딩테스트 - 다트게임 (0) | 2020.08.04 |
코딩테스트 - K번째수 (0) | 2020.08.03 |