하루에 한 문제
[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 파일명 정렬 -Java 본문
알고리즘/프로그래머스 lv2 다시풀기
[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 파일명 정렬 -Java
dkwjdi 2021. 3. 16. 21:24https://programmers.co.kr/learn/courses/30/lessons/17686
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Solution {
class Info implements Comparable<Info>{
String head;
String number;
String tail;
public Info(String head, String number, String tail) {
this.head = head;
this.number = number;
this.tail = tail;
}
@Override
public int compareTo(Info o) {
if(this.head.toUpperCase().compareTo(o.head.toUpperCase())==0) {
return Integer.parseInt(this.number)-Integer.parseInt(o.number);
}
return this.head.toUpperCase().compareTo(o.head.toUpperCase());
}
}
public String[] solution(String[] files) {
List<Info> info=new ArrayList<>();
for(int i=0; i<files.length; i++) {
StringBuilder head= new StringBuilder();
for(int j=0; j<files[i].length(); j++) {
char ch=files[i].charAt(j);
if(Character.isDigit(ch)) {//숫자라면
String numberAndtail=makeNumberAndTail(files[i], j);
String [] nAt=numberAndtail.split(",");
if(nAt.length==1) info.add(new Info(head.toString(),nAt[0],""));
else info.add(new Info(head.toString(),nAt[0],nAt[1]));
break;
}
else head.append(ch); //숫자 아니라면
}
}
Collections.sort(info);
String[] answer = new String[info.size()];
for(int i=0; i<info.size(); i++) {
Info result=info.get(i);
answer[i]=result.head+result.number+result.tail;
}
return answer;
}
private String makeNumberAndTail(String str, int j) {
StringBuilder sb= new StringBuilder();
for(int i=j; i<str.length(); i++) {
char c=str.charAt(i);
if(Character.isDigit(c)) sb.append(c);
else {
if(i==str.length()-1) sb.append(","+"");
else sb.append(","+str.substring(i));
return sb.toString();
}
}
sb.append(","+"");
// TODO Auto-generated method stub
return sb.toString();
}
}
소요시간 : 1시간 12분
문제를 똑바로 읽자..
TAIL에 공백이 올 수도 있다는 것을 똑바로 안보고 코딩을 해서 많이 해맸습니다.
그리고 정렬할때 이름이 같을 때 확인할 때는 toUpperCase()를 사용해서 비교했는데
밑에 리턴문에서 toUpperCase()를 안써서 이거 찾는다고 시간이 다갔습니다..ㅜ
로직을 살펴보면,
1. HEAD를 분리한다.
2. NUMBER를 분리한다.
3. 남은 TAIL을 저장한다.
그리고 정렬을 해줍니다. 정렬 조건은
1. HEAD순 정렬(대,소문자상관 X)
2. HEAD같다면 NUMBER 정렬 (String으로 받아서 Integer.parseInt로 변환해서 정렬해줍니다)
3. HEAD와 NUMBER 같다면 그대로
끝~
'알고리즘 > 프로그래머스 lv2 다시풀기' 카테고리의 다른 글
[프로그래머스-lv2 Summer/Winter Coding(~2018)]영어 끝말잇기 -Java (0) | 2021.03.17 |
---|---|
[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 압축 -Java (0) | 2021.03.16 |
[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 방금그곡 -Java (0) | 2021.03.16 |
[프로그래머스-lv2 2019 KAKAO BLIND RECRUITMENT] 오픈채팅방 -Java (1) | 2021.03.16 |
[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 캐시 -Java (0) | 2021.03.15 |
Comments