티스토리 뷰
프로그래머스 17686번 - [3차] 파일명 정렬
요구사항
1. 파일명을 HEAD, NUMBER, TAIL로 구분하여 각 기준을 통하여 정렬한 결과를 반환하라.
2. HEAD는 대소문자 구분을 하지 않고 사전 순으로 정렬하며 대소문자 차이 외에는 같을 경우 NUMBER의 정렬 기준을 따른다.
3. NUMBER는 오름차순으로 정렬되며, 숫자의 앞의 0은 무시된다. NUMBER 또한 같을 경우 원래의 입력 순서를 유지한다.
요구사항 분석 및 풀이과정
1. 주어진 파일명의 NUMBER의 부분만 구하면 파일명을 HEAD, NUMBER, TAIL로 구분하는 것은 쉽다.
2. 숫자가 처음 등장하는 부분과 숫자가 마지막으로 등장하는 부분을 구한다.
3. 그 위치를 기준으로 파일명을 HEAD, NUMBER, TAIL로 구분한다.
4. 주어진 조건대로 정렬한다.
소스코드 작성
import java.util.Arrays;
class Solution {
private static boolean isLetter(char c) {
return !isDigit(c);
}
private static boolean isDigit(char c) {
return Character.isDigit(c);
}
private static class Tuple {
private final int first;
private final int second;
public Tuple(int first, int second) {
this.first = first;
this.second = second;
}
public int first() {
return first;
}
public int second() {
return second;
}
}
private static class File implements Comparable<File> {
private final String fileName;
private final String head;
private final int number;
private final String tail;
private Tuple parse(String fileName) {
char[] chars = fileName.toCharArray();
int start = -1;
int end = -1;
for(int i = 1; i < chars.length; i++) {
if (isLetter(chars[i-1]) && isDigit(chars[i])) {
start = i;
} else if (isDigit(chars[i-1]) && isLetter(chars[i])) {
end = i;
break;
}
}
return new Tuple(start, end == -1 ? fileName.length() : end);
}
public File(String fileName) {
Tuple result = parse(fileName);
this.head = fileName.substring(0, result.first());
this.number = Integer.parseInt(fileName.substring(result.first(), result.second()));
this.tail = fileName.substring(result.second());
this.fileName = fileName;
}
public int compareTo(File other) {
if (this.head.equalsIgnoreCase(other.head)) {
return this.number - other.number;
}
return this.head.toLowerCase().compareTo(other.head.toLowerCase());
}
@Override
public String toString() {
return fileName;
}
}
public String[] solution(String[] files) {
return Arrays.stream(files)
.map(File::new)
.sorted()
.map(File::toString)
.toArray(String[]::new);
}
}
결과
소스코드 깃허브 주소
'코딩테스트 > 알고리즘' 카테고리의 다른 글
[알고리즘]프로그래머스 42586번 - 기능개발 (0) | 2022.01.09 |
---|---|
[알고리즘]프로그래머스 12949번 - 행렬의 곱셈 (0) | 2022.01.09 |
[알고리즘]프로그래머스 42747번 - H-Index (0) | 2022.01.09 |
[알고리즘]프로그래머스 12924번 - 숫자의 표현 (0) | 2022.01.09 |
[알고리즘]프로그래머스 12939번 - 최댓값과 최솟값 (0) | 2022.01.09 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 스트림
- 스택
- 코드 스니펫
- sql
- 해쉬
- 회고
- dfs
- set
- 연결리스트
- Java
- 알고리즘
- 코딩인터뷰
- 카카오
- JPA
- 문자열
- 구현
- 오늘의집
- dsu
- 비트연산
- 우선순위큐
- dp
- 프로그래머스
- Uber
- 쓰레드
- kotlin
- 정렬
- TDD
- 탐욕법
- BFS
- k8s
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함