1. 문제
https://programmers.co.kr/learn/courses/30/lessons/17686#qna
코딩테스트 연습 - [3차] 파일명 정렬
파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램
programmers.co.kr
2. 나의 풀이
import java.util.*;
class Solution {
public ArrayList<String> solution(String[] files) {
ArrayList<String> answer = new ArrayList<>();
for(String imsi : files) {
answer.add(imsi);
}
answer.sort((o1, o2) -> {
//System.out.println("o1 : " + o1 + ", o2 : " + o2);
String o1_head = "";
for(int i = 0; i < o1.length(); i = i + 1) {
//System.out.println("o1.charAt(" + i + ") : " + o1.charAt(i));
if(48 <= o1.charAt(i) && o1.charAt(i) <= 57) {
o1_head = o1.substring(0, i).toLowerCase();
break;
}
}
//System.out.println("o1_head : " + o1_head);
String o2_head = "";
for(int i = 0; i < o2.length(); i = i + 1) {
//System.out.println("o2.charAt(" + i + ") : " + o2.charAt(i));
if(48 <= o2.charAt(i) && o2.charAt(i) <= 57) {
o2_head = o2.substring(0, i).toLowerCase();
break;
}
}
//System.out.println("o2_head : " + o2_head);
if(o1_head.compareTo(o2_head) > 0) {
return 1;
}else if(o1_head.compareTo(o2_head) < 0) {
return -1;
}
int o1_number = o1.length();
for(int i = o1_head.length(); i < o1.length(); i = i + 1) {
if(48 > o1.charAt(i) || o1.charAt(i) > 57) {
o1_number = i;
//System.out.println("o1_number_end : " + o1_number);
break;
}
}
o1_number = Integer.parseInt(o1.substring(o1_head.length(), o1_number));
//System.out.println("o1_number : " + o1_number);
int o2_number = o2.length();
for(int i = o2_head.length(); i < o2.length(); i = i + 1) {
if(48 > o2.charAt(i) || o2.charAt(i) > 57) {
o2_number = i;
//System.out.println("o2_number_end : " + o2_number);
break;
}
}
//System.out.println(o2.substring(o2_head.length(), o2_number));
o2_number = Integer.parseInt(o2.substring(o2_head.length(), o2_number));
//System.out.println("o1_number : " + o1_number);
if(o1_number > o2_number) {
return 1;
}else if(o2_number > o1_number) {
return -1;
}
return 0;
});
return answer;
}
}
3. 다른 사람 풀이
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Solution {
public String[] solution(String[] files) {
List<FileName> fileNameList = new ArrayList<>();
String head, number, tail;
for (int i = 0; i < files.length; i++) {
String s = files[i];
Pattern p = Pattern.compile("[0-9]+");
Matcher m = p.matcher(s);
if (m.find()){
number = m.group();
int numberStartIndex = s.indexOf(number);
head = s.substring(0, numberStartIndex);
int numberEndIndex = numberStartIndex + number.length() - 1;
if (numberEndIndex + 1 > s.length() - 1) {
tail = "";
} else {
tail = s.substring(numberEndIndex + 1);
}
fileNameList.add(new FileName(head, number, tail));
}
}
fileNameList.sort(Comparator.comparing(FileName::getHead).thenComparing(Comparator.naturalOrder()));
String[] answer = new String[files.length];
for (int i = 0; i < files.length; i++) {
answer[i] = fileNameList.get(i).toString();
}
return answer;
}
public static class FileName implements Comparable<FileName> {
String head;
String number;
String tail;
public FileName(String head, String number, String tail) {
this.head = head;
this.number = number;
this.tail = tail;
}
public String getHead() {
return head.toUpperCase();
}
@Override
public String toString() {
return head + number + tail;
}
@Override
public int compareTo(FileName o) {
int mine = Integer.parseInt(this.number);
int yours = Integer.parseInt(o.number);
return mine - yours;
}
}
}
'알고리즘 공부 > 프로그래머스' 카테고리의 다른 글
(Java)프로그래머스 코딩테스트 연습 - 연습문제 - 가장 큰 정사각형 찾기 (0) | 2020.12.11 |
---|---|
(Java)프로그래머스 코딩테스트 연습 - 2018 KAKAO BLIND RECRUITMENT - [3차] n진수 게임 (0) | 2020.12.09 |
(Java)프로그래머스 코딩테스트 연습 - 2018 KAKAO BLIND RECRUITMENT - [3차] 압축 (0) | 2020.12.08 |
(Java)프로그래머스 코딩테스트 연습 - 2019 KAKAO BLIND RECRUITMENT - 오픈채팅방 (0) | 2020.12.01 |
(Java)프로그래머스 코딩테스트 연습 - 2018 KAKAO BLIND RECRUITMENT - [1차] 캐시 (0) | 2020.11.30 |