728x90
문제
풀이
정렬과 문자열에서 원하는 문자열을 추출할 수 있는지를 묻는 문제
정렬
- 람다식을 이용해 배열을 정렬
문자열 추출
- head 부분 추출 :
split("[0-9]")
정규표현식을 활용해서 숫자를 기준으로 문자열을 나눔 - number 부분 추출 : 뽑은 head 부분 다음부터의 문자열에서 숫자를 체크하기 위해
substring()
으로 head 부분을 잘라냄
코드
처음 제출한 코드 ( 통과하긴 했지만 코드가 맘에 들지 않았음 )
import java.util.*;
class Solution {
public String[] solution(String[] files) {
Arrays.sort(files, (o1, o2) -> {
String h1 = o1.split("[0-9]")[0];
String h2 = o2.split("[0-9]")[0];
int result = h1.toLowerCase().compareTo(h2.toLowerCase());
if (result == 0)
result = checkNum(o1) - checkNum(o2);
return result;
});
return files;
}
int checkNum(String s) {
StringBuilder num = new StringBuilder();
boolean flag = false;
for (int i = 0; i < s.length(); i++) {
if ('0' <= s.charAt(i) && s.charAt(i) <= '9') {
flag = true;
num.append(s.charAt(i));
}
else if (flag)
break;
}
return Integer.parseInt(num.toString());
}
}
수정한 코드 ( 불필요한 로직을 제거한 코드 )
import java.util.*;
class Solution {
public String[] solution(String[] files) {
Arrays.sort(files, (o1, o2) -> {
String h1 = o1.split("[0-9]")[0];
String h2 = o2.split("[0-9]")[0];
int result = h1.toLowerCase().compareTo(h2.toLowerCase());
if (result == 0)
result = checkNum(o1, h1) - checkNum(o2, h2);
return result;
});
return files;
}
int checkNum(String s, String header) {
String str = s.substring(header.length()); // head길이만큼 앞에서부터 잘라냄
String num = "";
for (char c : str.toCharArray()) {
if (Character.isDigit(c) && num.length() < 5)
num += c;
else
break;
}
return Integer.parseInt(num); // Integer.parseInt() 사용시 앞에 0인 것은 알아서 없애줌
}
}
참고
처음에 checkNum()에서 숫자를 판별할 때 '0' <= s.chatAt() <= '9'로 판별했는데,Character.isDigit()이라는 문자가 숫자인지 여부를 판단해주는 함수
를 사용해 가독성 좋게 코드를 수정
'프로그래머스' 카테고리의 다른 글
프로그래머스 lv2 - 뉴스 클러스터링 (자바) [2018 KAKAO BLIND RECRUITMENT] (2) | 2024.06.15 |
---|---|
프로그래머스 lv2 - 프렌즈4블록 (자바) [2018 KAKAO BLIND RECRUITMENT] (0) | 2024.06.14 |
프로그래머스 lv2 - 방금그곡 (자바) [2018 KAKAO BLIND RECRUITMENT] (0) | 2024.06.13 |
프로그래머스 lv2 - n진수 게임 (자바) [2018 KAKAO BLIND RECRUITMENT] (2) | 2024.06.09 |
프로그래머스 lv2 - 후보키 (자바) [2019 KAKAO BLIND RECRUITMENT] (0) | 2024.06.08 |