프로그래머스
2018 KAKAO BLIND RECRUITMENT
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[3차] 파일명 정렬
문제 정리
1. 기존 파일명 정렬은 숫자가 포함되면 관리가 불편하기 때문에 파일명에 포함된 숫자를 반영한 정렬 기능을 만들려고 한다.
2. 파일명은 100글자 이내에 영문 대소문자,숫자,공백,마침표,빼기부호만으로 이루져 있으며 숫자를 하나 이상 포함한다.
3. 파일명은 HEAD, NUMBER, TAIL의 세부분으로 구성
4. HEAD : 숫자가 아닌 문자로 이루여져 있으며 최소 한글자 이상 존재
5. NUMBER : 한글자에서 최대 다섯 글자 사이의 연속된 숫자
6. TAIL : HEAD와 NUMBER이 아닌 나머지 부분
시작하기 전 접근 방법
1.HEAD,NUMBER, TAIL 세부분으로 나눠서 각 부분에 따라 정렬하여 비교한다.
2. 매개변수 문자열에 대해 각 인덱스 별로 반복문을 통해서 HEAD, NUMBER,TAIL를 분류하여 배열에 저장한다.
3. Arrays.sor내에에서 compare메서드를 override 하여 정렬한다.

1. HEAD,NUMBER,TAIL 반복문을 통해서 세분류로 나눈다.
private String[] fileArr(String s){
String head = "";
String number = "";
String tail = "";
int index = 0;
for(; index<s.length(); index++){
char ch = s.charAt(index);
if(ch>='0' && ch<='9') break;
head += ch;
}
for (; index<s.length(); index++) {
char ch = s.charAt(index);
if (!(ch>='0' && ch<='9')) break;
number += ch;
}
for (; index<s.length(); index++) {
char ch = s.charAt(index);
tail += ch;
}
String[] file = {head.toLowerCase(),number,tail};
return file;
}
2. Arrays.sort 메소드를 사용하여 파일 배열을 정렬하며 람다 표현식을 사용하여 비교하였다. 먼저 HEAD부분을 비교하고 같을 경우에 NUMBER부분을 비교하여 정렬한다.
compareTo메서드를 이용하여 문자열을 비교하고 순서를 나타내는 정수 값을 반환한다.
sequence가 0인 경우는 두 HEAD값이 같기 때문에 NUMBER부분을 비교한다.
return num1-num2로 표현한 이유는 두 숫자를 비교했을 때 반환 값이 양수이면 첫번째가 두번째 파일보다 크다는 것을 의미한다.
Arrays.sort(files, (s1, s2) -> {
String[] file1 = fileArr(s1);
String[] file2 = fileArr(s2);
int sequence = file1[0].compareTo(file2[0]);
if (sequence == 0) {
int num1 = Integer.parseInt(file1[1]);
int num2 = Integer.parseInt(file2[1]);
return num1 - num2;
} else {
return sequence;
}
});
Arrays.sort comparator ?
더보기
배열이나 Collection 프레임워크 등에서 sort()를 사용하여 컴퓨터가 알아서 정렬하게 도와준다.
- Comparable : 기본 정렬 기준을 구현하는데 사용
- Comparator : 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용
- CompareTo 함수는 int의 경우 비교값 a, b가 있을 때
| a > b | result = 1 |
| a = b | result = 0 |
| a < b | result = -1 |
- Comparator 정의방법
Comparator<클래스타입>클래스명 = new Comparator<클래스타입>() 으로 정의하고 일반적으로 compare메소드를 오버라이드 하여 사용한다.
Comparator<Member>comp = new Comparator<Member>() {
@Override
public int compare(Person o1, Person o2) {
// TODO Auto-generated method stub
return 0;
}
};
- 익명 클래스를 이용하여 Override 작성하는 법
Arrays.sort(files, new Comparator<String>(){
@Override
public int compare(String s1, String s2){
String[] file1 = fileArr(s1);
String[] file2 = fileArr(s2);
int sequence = file1[0].compareTo(file2[0]);
if(sequence==0){
int num1 = Integer.parseInt(file1[1]);
int num2 = Integer.parseInt(file1[2]);
return num1-num2;
}else{
return sequence;
}
}
//일부 생략....
});
- Comparator 문자열 비교
문자열비교는 정수형 비교와 다르게 compareTo()메소드를 이용해서 비교해주는 방법이 있다. 아스키코드 값의 비교를 통해 왼쪽과 오른쪽을 비교하여 위에 나와있는 표처럼 값을 반환해준다.
전체 코드
더보기
import java.util.*;
class Solution {
public String[] solution(String[] files) {
Arrays.sort(files, (s1, s2) -> {
String[] file1 = fileArr(s1);
String[] file2 = fileArr(s2);
int sequence = file1[0].compareTo(file2[0]);
if (sequence == 0) {
int num1 = Integer.parseInt(file1[1]);
int num2 = Integer.parseInt(file2[1]);
return num1 - num2;
} else {
return sequence;
}
});
return files;
}
private String[] fileArr(String s) {
String head = "";
String number = "";
String tail = "";
int index = 0;
for (; index < s.length(); index++) {
char ch = s.charAt(index);
if (ch >= '0' && ch <= '9') break;
head += ch;
}
for (; index < s.length(); index++) {
char ch = s.charAt(index);
if (!(ch >= '0' && ch <= '9')) break;
number += ch;
}
for (; index < s.length(); index++) {
char ch = s.charAt(index);
tail += ch;
}
String[] file = {head.toLowerCase(), number, tail};
return file;
}
}
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 크레인 인형뽑기 게임 (0) | 2024.01.25 |
|---|---|
| [프로그래머스] 오픈채팅방 (1) | 2024.01.25 |
| [프로그래머스] n진수 게임 (0) | 2024.01.23 |
| [프로그래머스] 압축 (2) | 2024.01.23 |
| [프로그래머스] 튜플 (0) | 2024.01.20 |