반응형
https://programmers.co.kr/learn/courses/30/lessons/17686#
[ 문제풀이 ]
2018 카카오 기출문제들은 문자열을 다루는 문제가 참 많은 것 같다. 이 문제 또한 주어진 file에서 조건대로 HEAD, NUMBER를 추출한 후 정렬해주면 쉽게 해결할 수 있다.
다만, NUMBER를 추출할 경우 주의해야 한다.
NUMBER는 HEAD의 다음 인덱스부터 최대 다섯 글자로 이루어질 수 있지만 file의 총길이가 HEAD의 다음 인덱스 + 5보다 작을 수도 있기 때문에 둘 중 최솟값을 구하여 범위를 제한해줘야 한다.
그렇지 않으면 인덱스를 넘어가기 때문에 런타임 에러가 발생할 것이다.
import java.util.*;
class Solution {
class File implements Comparable<File> {
int idx, NUMBER;
String fileName, HEAD;
File(int idx, String fileName) {
this.idx = idx;
this.fileName = fileName;
}
public int compareTo(File o) {
if (this.HEAD.equals(o.HEAD)) {
if (this.NUMBER == o.NUMBER) {
return this.idx - o.idx;
}
return this.NUMBER - o.NUMBER;
}
return this.HEAD.compareTo(o.HEAD);
}
}
public String[] solution(String[] files) {
ArrayList<File> fileList = new ArrayList<>();
for (int i = 0; i < files.length; ++i) {
File file = new File(i, files[i]);
int headPos = getHeadPos(files[i]);
//HEAD는 대소문자를 구분하지 않기 때문에 소문자로 통일
file.HEAD = files[i].substring(0, headPos).toLowerCase();
int numberPos = getNumberPos(headPos, files[i]);
file.NUMBER = Integer.parseInt(files[i].substring(headPos, numberPos));
fileList.add(file);
}
//1.HEAD순 2.NUMBER순 3.idx순으로 정렬
Collections.sort(fileList);
String[] answer = new String[fileList.size()];
for (int i = 0; i < fileList.size(); ++i) {
answer[i] = fileList.get(i).fileName;
}
return answer;
}
public int getHeadPos(String s) {
for (int i = 0; i < s.length(); ++i) {
if (Character.isDigit(s.charAt(i))) {
return i;
}
}
return -1;
}
public int getNumberPos(int start, String s) {
//NUMBER부분은 최대 길이가 5이지만 문자열의 총 길이를 벗어날 수 있기 때문에
//둘 중 최소 값으로 범위를 제한함
int size = Math.min(s.length(), start + 5);
for (int i = start + 1; i < size; ++i) {
if (!Character.isDigit(s.charAt(i))) {
return i;
}
}
return size;
}
}
반응형
'Problem Solving > 카카오 블라인드 기출' 카테고리의 다른 글
2019 - 오픈채팅방 (0) | 2021.08.08 |
---|---|
2018 - [3차] n진수 게임 (0) | 2021.08.07 |
2018 - [3차] 자동완성 (0) | 2021.08.07 |
2018 - [3차] 압축 (0) | 2021.08.07 |
2018 - [3차] 방금그곡 (0) | 2021.08.07 |
댓글