본문 바로가기
프로그래머스

프로그래머스 lv2 - 파일명 정리 (자바) [2018 KAKAO BLIND RECRUITMENT]

by dragonDeok 2024. 6. 11.
728x90

문제


프로그래머스 lv2 - 파일명 정리

풀이


정렬과 문자열에서 원하는 문자열을 추출할 수 있는지를 묻는 문제

정렬

  • 람다식을 이용해 배열을 정렬

문자열 추출

  • 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()이라는 문자가 숫자인지 여부를 판단해주는 함수를 사용해 가독성 좋게 코드를 수정

참고 - isDigit()